$ echo -e 'CH12\nCH23au' | sed '/^CH/s=^=<b>='
<b>CH12
<b>CH23au
我知道我可以匹配以CH
by开头的行^CH
,但如何匹配多个模式?
例子:
输入:
CH12
CH23au
输出:
CH12
<b>CH23au
如何只放置<b>
在有的地方^CH
和au
行中?
答案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>/
}