Wie kann man nur Linien ersetzen, die mehreren Mustern in sed entsprechen?

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

Ich weiß, dass ich Linien von Anfang CHan ^CHabgleichen kann, aber wie kann ich mehrere Muster abgleichen?

Beispiel:

Eingang:

CH12
CH23au

Ausgabe:

CH12
<b>CH23au

Wie kann man nur dort setzen, <b>wo es ist ^CHund auin der Linie?

gasko peter
quelle

Antworten:

8

Wenn das CHam Zeilenanfang auftreten muss, ist die Reihenfolge von CHund aufestgelegt, sodass Sie suchen können ^CH.*au.

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

Wenn die Reihenfolge der beiden Muster nicht festgelegt ist, könnte man so etwas tun

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

aber die Perl-Lösung

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

ist wahrscheinlich besser lesbar.

Uwe
quelle
5

Ein anderer Ansatz:

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

b(Verzweige zum Ende, wenn kein Label-Argument angegeben ist) ist wie continueoder nextin anderen Sprachen. Das Obige ist also wie folgt:

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