если perl
в порядке, можно использовать режим абзаца (параметр -00
) и использовать многострочный соответствие регулярному выражению
$ cat ip.txt
eggs
bacon
cereal
eggs
bacon
cheese
cereal
$ perl -00 -ne 'print if !/^eggs.*cheese.*cereal$/ms' ip.txt
eggs
bacon
cereal
Чтобы сопоставить все не -буквенно-цифровые символы, используйте [^[:alnum:]]
. Это похоже на[^abc]
:начальный знак вставки заставляет выражение в квадратных скобках соответствовать всем символам, кроме перечисленных.
Чтобы сопоставить буквальное тире, нужно убедиться, что оно не интерпретируется как создание списка совпадающих символов. Сделайте его первым символом выражения в квадратных скобках:[-,.;/()_]
.
Обратите внимание, что sed не принимает /
в качестве разделителя для s///
, если оно находится в выражении в квадратных скобках, поэтому нет необходимости ставить перед ним обратную косую черту. (Обратная косая черта будет соответствовать самой себе. ). echo 'a\b/c' | sed 's/[/\]/./g'
печатает a.b.c
.
См., например, справочную страницуregex(7)
для описания синтаксиса регулярных выражений. (Обратите внимание, что в основном обсуждаются расширенные регулярные выражения (ERE ), используемые sed -E
во многих/большинстве sed.)