2013-02-05 39 views
1

比方说,我有一个具有./bar2.txt 和bar2.txt内容的路径是确实发现命令忽略锚

输出的

./bar2.txt 

grep "\bbar2\b" * 

文件
bar2.txt:./bar2.txt 

与预期的一样,wheres

find . -regextype posix-extended -regex "\bbar2\b" 

找不到任何东西。

我知道我应该正则表达式改为

".*/bar2.*" 

因为发现查找完整路径。那么,这是否意味着找到指定字边界的忽略\ b?

在此先感谢。

+0

可能需要双击逃生“ ”\\ \\ bbar2 B“ 代替',因为在查找甚至被调用之前,第一层反斜杠将被外壳剥离。 –

+0

@MarcB试过,但没有运气。仍然不起作用。 – bfaskiplar

回答

0

但是,我很好奇的是为什么它忽略了\b,它指定了字 边界。

从我的理解\bPerl regular expressions一部分,并不会提供给find,作为find不支持Perl的regextype为grep一样。

+0

我知道它匹配文件名。然而,我很好奇的是为什么它忽略了指定字边界的\ b。发现总是试图匹配所有路径。但是,通过指定字边界,我期望它在上面给出的例子中仅匹配单词即bar2。 我给出了另外一个例子,用grep和一个正则表达式来说明如何在grep中正常使用字边界选项。当比较两个命令的结果时,我可以得出结论\ b在find中找不到它,它在grep中可以正常工作。 – bfaskiplar

+0

它不会忽略\ b。如果反斜杠字符不是正则表达式元字符,则只是字符本身。因此,对于不知道单词边界的正则表达式引擎,'\ b'和'b'是相同的表达式。 –

1

grepfind会使用不同的正则表达式引擎。值得注意的是,POSIX正则表达式(其中find使用)不包含“\ b”作为字边界,因此它与“b”相同。在OSX,例如,这些有同样的结果:

find . -regex '.*bar2.txt' -print

find . -regex '.*\bar2.txt' -print

仔细检查联机帮助,以确保-regex是做什么你的想法。对于我的find,正则表达式必须匹配整个文件名,例如这没有找到任何文件:

find . -regex 'bar' -print

但这一个作用:

find . -regex '.*bar.*' -print