我在使用 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 样式的行尾,回车符 ( ) 后跟换行符 ( ):grep
od
\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">