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)
调试此类事情的一个非常有用的工具是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)
| 归档时间: |
|
| 查看次数: |
1281 次 |
| 最近记录: |