Как сказать "не" определенный символ в 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 и отрицание подстроки