链接(管道)grep是否忽略元字符?

链接(管道)grep是否忽略元字符?,grep,wildcard,Grep,Wildcard,在复杂(链式)grep命令中搜索带有的行时遇到问题。 这是我的错误还是错误 grep '\.' filename | grep 1 # works correctly (finds lines with '.' and '1') grep 1 filename | grep '\.' # fails: ignores 2nd grep, returns lines with or without '.' 这不是管道造成的;这确实与格雷普有关。 坦率地说,这似乎不可信,但却是事实:

在复杂(链式)grep命令中搜索带有
的行时遇到问题。
这是我的错误还是错误

grep '\.' filename | grep 1    # works correctly (finds lines with '.' and '1')
grep 1 filename | grep '\.'    # fails: ignores 2nd grep, returns lines with or without '.'
这不是管道造成的;这确实与格雷普有关。
坦率地说,这似乎不可信,但却是事实:

cat filename | grep 1 | grep '\.'   # works correctly (and provides an easy work-around for the bug)
添加更多保护无助于:

grep 1 filename | grep '\\.'      # fails
如果通配符后面或前面有某个内容,则它会起作用:

grep 1 filename | grep 'a\.'     #  works
grep 1 filename | grep '\.a'     #  works
但如果某物是一个范围,则不是:

grep 1 filename | grep '[0-9]\.'    # fails
grep 1 filename | grep '\.[0-9]'    # fails
我不敢相信这真的是一个错误-我一定错过了什么,对吗

谢谢

uname -a
Linux conception 2.6.32-33-generic #70-Ubuntu SMP Thu Jul 7 21:09:46 UTC 2011 i686 GNU/Linux
首先,“链接”grep命令类似于“mauvaiston”。大多数情况下,
grep | grep
可以替换为一个具有复杂正则表达式的
grep

正在用
1
编辑行

$> cat ./text | grep -P "(\..*1|1.*\.)"
line with 1 and . in it
-p
表示perl正则表达式
“(\..*1.*\)”
是(
,一些符号和
1
)或(
1
,一些符号和

因此,如果您对通配符的用法不太确定,正则表达式可能是您有用、安全和强大的工具

$> cat ./text 
line without anything
another line
line with.ok
and one another
line with 1
some text

line with 1 and . in it
empty line
last line
第一个示例
grep'\.'filename | grep 1
grep 1 filename | grep'\.
cat filename | grep 1 | grep'\.
返回正确答案

line with 1 and . in it
第二个示例
grep1 filename | grep'\\.
失败,因为您正在使用任何符号对
\
进行grep。首先,“chained”grep命令类似于“mauvais ton”。大多数情况下,
grep | grep
可以替换为一个具有复杂正则表达式的
grep

正在用
1
编辑行

$> cat ./text | grep -P "(\..*1|1.*\.)"
line with 1 and . in it
-p
表示perl正则表达式
“(\..*1.*\)”
是(
,一些符号和
1
)或(
1
,一些符号和

因此,如果您对通配符的用法不太确定,正则表达式可能是您有用、安全和强大的工具

$> cat ./text 
line without anything
another line
line with.ok
and one another
line with 1
some text

line with 1 and . in it
empty line
last line
第一个示例
grep'\.'filename | grep 1
grep 1 filename | grep'\.
cat filename | grep 1 | grep'\.
返回正确答案

line with 1 and . in it
第二个示例
grep 1 filename | grep'\\.
失败,因为您正在用任何符号对
\
进行grep。

我的愚蠢错误

我正在grep一堆文件,文件名本身包含一个“.”:

cat one.file
    1
    2
    3

cat second.file  
    10  
    11  
    12.  
现在

我看了一下输出,认为第二个grep被忽略了。现在很明显发生了什么,但今天早上我真的很生气。

我愚蠢的错误

我正在grep一堆文件,文件名本身包含一个“.”:

cat one.file
    1
    2
    3

cat second.file  
    10  
    11  
    12.  
现在


我看了一下输出,认为第二个grep被忽略了。现在很明显发生了什么,但今天早上我真的很烦。

为了好玩,你试过使用
fgrep
进行控制测试吗?如果能看到你的
文件名和grep版本,那就太好了。好吧,我做了一些蠢事。我使用了一个通配符来同时查看一组文件:
grep1filenam*| grep'\.
,文件名中有一个“.”。应该马上发现的-抱歉打扰了!对于kicks,您是否尝试过使用
fgrep
进行控制测试?看到您的
filename
和grep版本将非常棒。好的,我做了一些愚蠢的事情。我使用了一个通配符来同时查看一组文件:
grep1filenam*| grep'\.
,文件名中有一个“.”。应该马上发现的-抱歉打扰了!所以对你来说,grep1文件名| grep'\'。对你来说,grep1文件名| grep'\'