如何在将输出重定向到文件时标记匹配的 GREP 字符串

如何在将输出重定向到文件时标记匹配的 GREP 字符串

我正在尝试使用 grep 查找文件中所有匹配的字符串,并将它们根据行上下文输出到另一个文件,同时在匹配的每一侧添加某种标记(最好是两个星号)。

例如,我有input.txt以下竞赛的文件:

Dog walks in the park
Man runs in the park
Man walks in the park
Dog runs in the park
Dog is still
They run in the park
Woman runs in the park

然后,我执行 grep 搜索并重定向到文件:

grep -P ' runs? ' input.txt > output.txt

它创建output.txt包含以下竞赛的文件:

Man runs in the park
Dog runs in the park
They run in the park
Woman runs in the park

我想做的是获得这样的输出:

Man **runs** in the park
Dog **runs** in the park
They **run** in the park
Woman **runs** in the park

也就是说,在上下文中的每个匹配项周围添加两个星号。

我知道我可以通过添加选项来获得匹配项-o

grep -P ' runs? ' input.txt > output.txt

但我需要结合上下文来看待它们。

我还知道我可以通过运行以下命令在交互式会话中突出显示这些匹配项:

GREP_OPTIONS='--color=auto'

但是我在 bash 脚本中使用 grep,所以它对我没有用。

所以我想知道是否有任何方法可以直接使用 grep 在输出文件中标记这些匹配项。我知道我可能稍后可以将 grep 输出传送到不同的命令来实现这一点,但我更愿意使用一些 grep 选项。可能吗?如果没有,那么在将 grep 与其他工具结合使用时,实现所需输出的最直接方法是什么?

答案1

您想使用其他工具来执行替换,例如sed

sed -n 's/ \(runs\?\) / **\1** /p' input.txt > output.txt

或者 Perl:

perl -ne 's/ (runs?) / **$1** /&&print' input.txt > output.txt

相关内容