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

Eu sei que posso combinar linhas que começam com CH por ^CH , mas como posso corresponder a vários padrões?

Exemplo:

Entrada:

CH12
CH23au

Saída:

CH12
<b>CH23au

Como colocar apenas <b> onde há ^CH e au na linha?

    
por gasko peter 15.05.2013 / 18:02

2 respostas

8

Se o CH tiver que ocorrer no início da linha, a ordem de CH e au será corrigida, 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.

    
por 15.05.2013 / 18:08
5

Outra abordagem:

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

b (ramificar para o final, se não receber nenhum argumento de rótulo) é como continue ou next em 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>/
}
    
por 15.05.2013 / 20:46

Tags