如何仅替换 sed 中与多个模式匹配的行?

如何仅替换 sed 中与多个模式匹配的行?
$ echo -e 'CH12\nCH23au' | sed '/^CH/s=^=<b>='
<b>CH12
<b>CH23au

我知道我可以匹配以CHby开头的行^CH,但如何匹配多个模式?

例子:

输入:

CH12
CH23au

输出:

CH12
<b>CH23au

如何只放置<b>在有的地方^CHau行中?

答案1

如果CH必须出现在行首,CH则 和的顺序au是固定的,因此您可以查找^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>/
}

相关内容