Как сказать "не" определенный символ в sed
?
Sed: Может ли мой шаблон содержать символ "не является"? Как сказать "не Х"?
Ответ 1
[^x]
Это класс символов, который принимает любой символ, кроме x
.
Ответ 2
Для тех не удовлетворенных выбранным ответом как комментарий johnny.
'su [^ x]' будет соответствовать "sum" и "sun", но не "su".
Вы можете передать sed в строки соответствия not
с помощью x
с помощью синтаксиса ниже:
sed '/x/! s/su//' file
Ответ 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 и отрицание подстроки