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

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

我在使用 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'

答案1

一个非常有用的调试此类事情的工具是。传递命令od的输出显示您的文件包含 DOS 样式的行尾,回车符 ( ) 后跟换行符 ( ):grepod\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

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

$ echo -ne "<div class=\"spacer\">\r\n<div class=\"spacer\">\r\n" > foo.php
$ cat foo.php 
<div class="spacer">
<div class="spacer">

我确认grep打印空行:

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


$

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

$ echo -e "foo\rbar"
bar

实际情况是,首先foo打印 ,然后由于 而被删除\r,并被 替换bar。使用 进行检查od

$ echo -e "foo\rbar" | od -c
0000000   f   o   o  \r   b   a   r  \n
0000010

现在,我不明白为什么colors选项grep会改变事情。这一定与特殊字符的显示方式有关。无论如何,您可以通过删除所有来解决问题 \r

$ sed 's/\r//g' default.php > bar.php

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

$ grep -ni '."spacer">' bar.php 
103:                <div class="spacer">
222:            <div class="spacer">

相关内容