只打印grep匹配自己,行上没有其他东西也没有额外的换行符

时间:2016-05-18 20:17:09

标签: bash shell grep

当我们使用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? (如果匹配在不同的行上,我仍然希望它们之间有换行符)

2 个答案:

答案 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