Como substituir apenas linhas que correspondem a vários padrões no sed?

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

Sei que posso corresponder a linhas iniciadas CHpor, ^CHmas como posso corresponder a vários padrões?

Exemplo:

Entrada:

CH12
CH23au

Resultado:

CH12
<b>CH23au

Como colocar apenas <b>onde existe ^CHe auna fila?

gasko peter
fonte

Respostas:

8

Se o CHitem deve ocorrer no início da linha, a ordem de CHe aué fixa, para que você possa procurar ^CH.*au.

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

Se a ordem dos dois padrões não for fixa, pode-se fazer algo como

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

mas a solução perl

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

é provavelmente mais legível.

Uwe
fonte
5

Outra abordagem:

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

b(ramificar para o final, se não houver argumento de rótulo) é semelhante continueou nextem outros idiomas. Então, o acima é como:

for (; line = readline(); print line) { # The implicit loop in sed
  if (!/^CH/) continue;
  if (!/au/) continue;
  line =~ s/^/<b>/
}
Stéphane Chazelas
fonte