Как заменить только те строки, которые соответствуют нескольким шаблонам в sed?

8
$ echo -e 'CH12\nCH23au' | sed '/^CH/s=^=<b>='
<b>CH12
<b>CH23au

Я знаю, что могу сопоставлять строки, начинающиеся с CH, ^CHно как я могу сопоставить несколько шаблонов?

Пример:

Входные данные:

CH12
CH23au

Вывод:

CH12
<b>CH23au

Как поставить только <b>там, где есть ^CHи auна линии?

Гаско Питер
источник

Ответы:

8

Если CHдолжно произойти в начале строки, порядок CHи auфиксирован, так что вы можете искать ^CH.*au.

$ echo -e 'CH12\nCH23au' | sed '/^CH.*au/s=^=<b>='
CH12
<b>CH23au
$

Если порядок двух шаблонов не фиксирован, можно сделать что-то вроде

sed -e '/pattern1/{;/pattern2/s/old/new/;}'

но решение Perl

perl -pe 'if (/pattern1/ && /pattern2/) {s/old/new/;}'

вероятно, более читабельно.

Uwe
источник
5

Другой подход:

sed -e '/^CH/!b' -e '/au/!b' -e 's/^/<b>/'

b(переходить до конца, если не задан аргумент метки), как continueили nextв других языках. Таким образом, выше, как:

for (; line = readline(); print line) { # The implicit loop in sed
  if (!/^CH/) continue;
  if (!/au/) continue;
  line =~ s/^/<b>/
}
Стефан Шазелас
источник