带有彩色输出的 grep 返回几个空行

loa*_*age 6 linux bash grep pipe

我对 grep 有奇怪的问题(2.12-2,debian 测试)。

在某些情况下,当我执行以下操作时: grep -rni '."spacer">.' .grep 返回几行空行:

在此处输入图片说明

如果我添加--color=none所有行变得可见。

.bashrc 中的 grep 选项:

export GREP_COLORS='fn=01;34:ms=01;33:ln=33'
alias grep='grep --color=auto'
Run Code Online (Sandbox Code Playgroud)

ter*_*don 7

调试此类事情的一个非常有用的工具是od. 传递grep命令的输出od表明您的文件包含 DOS 样式的行结尾,回车 ( \r) 后跟一个新行 ( \n):

$ grep -i '."spacer">.' default.php | od -c
0000000  \t  \t  \t  \t  \t   <   d   i   v       c   l   a   s   s   =
0000020   "   s   p   a   c   e   r   "   >  \r  \n  \t  \t  \t   <   d
0000040   i   v       c   l   a   s   s   =   "   s   p   a   c   e   r
0000060   "   >  \r  \n
0000064
Run Code Online (Sandbox Code Playgroud)

所以,为了测试,我创建了这个最小的测试文件:

$ echo -ne "<div class=\"spacer\">\r\n<div class=\"spacer\">\r\n" > foo.php
$ cat foo.php 
<div class="spacer">
<div class="spacer">
Run Code Online (Sandbox Code Playgroud)

我确认grep打印空行:

$ grep -i '."spacer">.' foo.php 


$
Run Code Online (Sandbox Code Playgroud)

它打印空行的原因是回车 ( \r)。您要求grep查找字符串spacer"> 和以下字符。在您的文件中,以下字符是\r. \r在终端中打印具有清除打印的最后一行的效果,因此导致显示空行。您可以使用以下命令对此进行测试:

$ echo -e "foo\rbar"
bar
Run Code Online (Sandbox Code Playgroud)

实际发生的是,第一个foo被打印出来,然后被删除,因为\r,取而代之bar。检查od

$ echo -e "foo\rbar" | od -c
0000000   f   o   o  \r   b   a   r  \n
0000010
Run Code Online (Sandbox Code Playgroud)

现在,我不明白为什么colors选择grep正在改变事物。它必须与特殊字符的显示方式有关。在任何情况下,您都可以通过删除所有内容来解决您的问题 \r

$ sed 's/\r//g' default.php > bar.php
Run Code Online (Sandbox Code Playgroud)

然后,.从您的 grep 模式中删除最后一个(请记住,默认情况下.不匹配换行符,尽管它确实匹配\r):

$ grep -ni '."spacer">' bar.php 
103:                <div class="spacer">
222:            <div class="spacer">
Run Code Online (Sandbox Code Playgroud)

  • 也许,但如果这不是错误,为什么 --color=auto/always 输出不正确? (2认同)
  • 我来得太晚了。非常老的错误 http://savannah.gnu.org/bugs/?25539 (2认同)