当我们使用grep foobar
时,它会完全打印包含foobar
的所有行,而不仅仅是foobar部分
$ echo "abc foobar uvw foobar xyz" | grep foobar
abc foobar uvw foobar xyz
另一方面,如果我们使用-o
标志,则不会打印该行的其他部分。
但是,现在它会插入额外的换行符:
$ echo "abc foobar uvw foobar xyz" | grep foobar
foobar
foobar
尽管输入只有一行,但输出有两行。
我们如何获得输出foobarfoobar
? (如果匹配在不同的行上,我仍然希望它们之间有换行符)
答案 0 :(得分:3)
你可以使用perl
perl -lne 'print /foobar/g if /foobar/' file
输入
foobar 12 c fds f foobar
wak foobar sshak
dsfgsg dsfgsgf sdgfsfd
foobar foobar foobar
输出
foobarfoobar
foobar
foobarfoobarfoobar
perl -lne 'print /foo[a-z]+/g if /foo[a-z]+/' file
输入
foobuz 12 c fds f foobaz
wak foocuz sshak
sdfsdf ds fdf
fooduz foofuz fooguz
输出
foobuzfoobaz
foocuz
fooduzfoofuzfooguz
答案 1 :(得分:2)
这是一个awk解决方案:
awk -F 'foobar' 'NF>1{for (i=1; i<NF; i++) printf "%s", FS; print ""}' file
foobarfoobar
foobar
foobarfoobarfoobarfoobar
foobar
根据以下评论,如果要求使用正则表达式,则可以使用以下gnu awk
命令:
awk -v RS='foo[a-z]+' 'RT{s=RT; r=NR>1 && ($0~/\n/)}
s{printf "%s%s", (r?ORS:""), s; s=""} END{print ""}' file
输入为:
cat file
abc foobar uvw foobar xyz
abc foobar 123
abc 123
foobar foobar foobar foobar
foobar