Если я правильно понял, вы хотите применить некоторые изменения к различным строкам, кроме строки, соответствующей регулярному выражению, верно? В этом случае предположим, что у меня есть следующий файл:
$ cat file
this is a def
this has no d e f
this is a page by the way
but this is no p a g e as we know ito
Мы хотим заменить все this
на that
, но игнорируем строки, содержащие def
или page
. Итак, сначала мы удаляем строки, начинающиеся с def
или page
:
/def/d;/page/d;
Затем мы применяем нашу операцию как обычно:
s/this/that/g
Результат:
$ sed '/def/d;/page/d;s/this/that/g' file
that has no d e f
but that is no p a g e as we know ito
Но если под "пропустить" вы имеете в виду "не применять мои операции", просто отрицайте адрес:
$ sed -E '/(def|page)/!s/this/that/g' file
this is a def
that has no d e f
this is a page by the way
but that is no p a g e as we know ito
Вышеприведенное утверждение верно. Интересно, что оператор «или» связан с «расширенным регулярным выражением». Поэтому вы должны указать -E для «расширенного регулярного выражения», потому что sed по умолчанию использует только «базовые регулярные выражения».
Например, следующий оператор не работает:
$ sed -e '/(def|page)/!s/[A-Za-z_]*login[A-Za-z_]*/page.&/g' < file > new_file
Но это утверждение ниже работает:
$ sed -E '/(def|page)/!s/[A-Za-z_]*login[A-Za-z_]*/page.&/g' < file > new_file