Подтвердить что ты не робот

Sed: Может ли мой шаблон содержать символ "не является"? Как сказать "не Х"?

Как сказать "не" определенный символ в sed?

4b9b3361

Ответ 1

[^x]

Это класс символов, который принимает любой символ, кроме x.

Ответ 2

Для тех не удовлетворенных выбранным ответом как комментарий johnny.

'su [^ x]' будет соответствовать "sum" и "sun", но не "su".

Вы можете передать sed в строки соответствия not с помощью x с помощью синтаксиса ниже:

sed '/x/! s/su//' file

См. ответ kkeller для другого примера.

Ответ 3

Есть две возможные интерпретации вашего вопроса. Как уже отмечалось, [^x] соответствует одному символу, который не является x. Но пустая строка также не x, поэтому, возможно, вы ищете [^x]\|^$.

Ни один из этих ответов не распространяется на многосимвольные последовательности, которые обычно ищут люди. Вы могли бы кропотливо построить что-то вроде

[^s]\|s\($\|[^t]\|t\($\|[^r]\)\)\)

чтобы составить регулярное выражение, которое не соответствует str, но гораздо более простое решение в sed - удалить любую строку, которая соответствует str, а затем сохранить остальные;

sed '/str/d' file

Perl 5 представил гораздо более богатый механизм регулярных выражений, который, следовательно, является стандартным в Java, PHP, Python и т.д. Поскольку Perl помогает подмножество синтаксиса sed, вы, вероятно, можете преобразовать простой sed script в Perl, чтобы использовать полезную функцию на этом расширенном диалекте регулярного выражения, например, отрицательные утверждения:

perl -pe 's/(?:(?!str).)+/not/' file

заменит строку, которая не str с not. (?:...) - это не захватывающая группа (в отличие от многих диалектов sed неотрицательная скобка является метасимволом в Perl), а (?!str) является отрицательным утверждением; текст сразу после этой позиции в строке не должен быть str для соответствия регулярному выражению. + повторяет этот шаблон до тех пор, пока он не будет соответствовать. Обратите внимание, как утверждение должно быть истинным в каждой позиции в матче, поэтому мы сопоставляем один символ за раз с . (новички часто ошибаются и ошибочно утверждают только, например, начало более длинного шаблона, который, однако, может сопоставьте str где-то внутри, что приведет к "утечке" ).

Ответ 4

Из моего собственного опыта, и нижеподдержка поддерживает это, sed не поддерживает нормальное отрицание регулярных выражений с помощью "^". Я не думаю, что у sed есть метод прямого отрицания... но если вы проверите приведенный ниже пост, вы увидите некоторые обходные пути. Повторное выражение Sed и отрицание подстроки