如何使sed省略不匹配的行?


8

在以下示例中,sed匹配以a a或a 开头的行,c并打印该行的第一个字符(ac):

$ echo "ag
bh
ci
dj
ek
fl" | sed 's/\(a\|c\)./\1/' # Matches lines starting with 'a' or 'c'.

output:
a
bh
c
dj
ek
fl

但是,与图案不匹配的线也会被打印出来。我该如何sed忽略与模式不匹配的行?我可以通过将其与grep(如下所示)组合来获得所需的效果,但是我想知道是否sed可以“单独”实现该效果。

$ echo "ag
bh
ci
dj
ek
fl" | grep '[ac]' | sed 's/\(a\|c\)./\1/'

output:
a
c

这与您真正想知道的内容无关紧要,但是您的模式应该以^开头,因此它锚定到行的开头。按照编码,只要不是最后一个字符,它将匹配行中的a或c。
2013年

Answers:


12

使用no-print标志(-n)并显式打印成功的替代命令(s///p):

 sed -n 's/\(a\|c\)./\1/p'
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.