複数のパターンに一致するsedの行だけを変更する方法は?

複数のパターンに一致するsedの行だけを変更する方法は?
$ echo -e 'CH12\nCH23au' | sed '/^CH/s=^=<b>='
<b>CH12
<b>CH23au

CHbyで始まる行を一致させることができることを知っていますが、複数のパターンをどのように一致^CHさせることができますか?

例:

入力する:

CH12
CH23au

出力:

CH12
<b>CH23au

<b>特定の場所^CHと行にのみ配置する方法はau

答え1

合計の順序は固定されているため、その行CHの先頭に表示する必要がある場合は見つかります。CHau^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/;}'

読みやすくすることもできます。

答え2

別の方法:

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>/
}

関連情報