我有以下foo.txt
文件:
This is the first line.
This is the middle line.
This is the last line.
我试图仅通过单词来 grep 中线middle
并返回周围环境(作为示例),这样我就可以突出显示整个句子(这在与上下文选项一起使用时特别有用)。
它做没有颜色的工作:
$ grep -o --color=none '.\+ middle .\+' foo.txt
This is the middle line.
但同样的命令不使用颜色:
$ grep -o --color=auto '.\+ middle .\+' foo.txt
(empty line)
注意:没有-o
它没有任何区别。
尽管它在仅过滤行的前半部分时有效:
$ grep -o --color=auto '.\+ middle' foo.txt
This is the middle
但下半场则不然 ( 'middle .\+'
)。
为什么这不能按预期工作以及如何修复它?这是一个错误还是由于某种原因我无法同时使用两个正则表达式?
在 OS X 上测试:
$ grep --version
grep (BSD grep) 2.5.1-FreeBSD
虽然它似乎可以在Linux上运行,所以我很困惑。
答案1
当您将 grep 与颜色选项一起使用时,它会产生额外的转义字符序列,告诉终端打开或关闭颜色,这些序列会带来无法正确解释并导致意外结果的风险。
您可以通过捕获 grep 的输出来查看这些内容
没有颜色
将 grep 输出发送到output.txt
% grep -o --color=none '.\+ middle .\+' foo.txt > output.txt
% cat -etv output.txt
This is the middle line.$
有颜色
使用选项强制颜色--color=always
。如果您重定向 grep 输出,它会 - 如果可能 - 出于您突出显示的确切原因关闭颜色,转义字符可能会产生副作用。
% grep -o --color=always '.\+ middle .\+' foo.txt > output.txt
% cat -etv output.txt
^[[01;31m^[[KThis is the middle line.^[[m^[[K$
这些转义序列可能导致了问题。