¿Cómo sustituir solo líneas que coinciden con varios patrones en sed?

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

Sé que puedo hacer coincidir líneas que comienzan CHpor ^CHpero, ¿cómo puedo hacer coincidir múltiples patrones?

Ejemplo:

Entrada:

CH12
CH23au

Salida:

CH12
<b>CH23au

¿Cómo poner solo <b>donde hay ^CHy auen la línea?

Gasko Peter
fuente

Respuestas:

8

Si CHdebe aparecer al principio de la línea, el orden de CHy aues fijo, por lo que puede buscar ^CH.*au.

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

Si el orden de los dos patrones no es fijo, uno podría hacer algo como

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

pero la solución perl

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

Es probablemente más legible.

Uwe
fuente
5

Otro enfoque:

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

b(salte al final si no se le da ningún argumento de etiqueta) es como continueo nexten otros idiomas. Entonces lo anterior es como:

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