链接(管道)grep是否忽略元字符?
在复杂(链式)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 '\.' 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'\'