如何使用 grep 只获取匹配部分,而不引入额外的换行符

如何使用 grep 只获取匹配部分,而不引入额外的换行符

我有一个命令的输出,我想通过管道传输到某种 grep 命令,以获取每行中与给定正则表达式匹配的部分,并且仅输出匹配部分,而不引入换行符

我知道grep -o可以做一些非常类似的事情,但它会为每个匹配生成一个换行符,并且我的命令的输出也包含许多新行。

例子:

输入(我的命令的输出):

banana apple banana
apple bananas banned

正则表达式:

ban[a-z]*

输出由grep -o:

banana
banana
bananas
banned

预期产出:

bananabanana
bananasbanned

我能想到的一件事是使用tr将换行符替换为某个不太可能出现在命令输出中的字符,将输出提供给grep -o,然后使用tr取回换行符。

mycommand|tr '\n' @|grep -o regex|tr -d '\n'|tr @ '\n'

不过我认为应该有一些更好的解决方案。任何帮助,将不胜感激。

答案1

如果您不介意使用perl

mycommand | perl -lne 'print join "", /ban[a-z]*/g'

每行上的匹配项都会在列表上下文中返回,您可以使用空分隔符将其连接起来。

相关内容