如何仅替换与sed中的几种模式匹配的行?


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

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

例:

输入:

CH12
CH23au

输出:

CH12
<b>CH23au

如何只放<b>那里是^CHau该行?

Answers:


8

如果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/;}'

可能更具可读性。


5

另一种方法:

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

b(如果未提供任何label参数,则分支到最后)是like continuenext其他语言。所以上面是这样的:

for (; line = readline(); print line) { # The implicit loop in sed
  if (!/^CH/) continue;
  if (!/au/) continue;
  line =~ s/^/<b>/
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.