假设我有两个文件:ac
和abc
。我想找到一个正则表达式来匹配两个文件。通常,我希望以下正则表达式能够正常工作,但它永远不会起作用:
find ./ -name ab?c
我尝试转义或不转义问号,但这似乎行不通。通常在我找到的正则表达式文档中; ?
的意思是:先前的字符重复了0或1次,但是find
似乎不理解这一点。
我已经在两个不同的查找版本上进行了尝试:GNU查找版本4.2.31和 查找(GNU findutils)4.6.0
PS:这可以与*
一起使用,但是我特别想只匹配一个可选字符。
find ./ -name a*c
给予
./ac
./abc
答案 0 :(得分:4)
传递给-name
的表达式不是正则表达式,而是全局表达式。 (单个)全局表达式不能用于您的用例,但是您可以使用-regex
使用正则表达式:
find -regex '.*/ab?c'
顺便说一句,默认的正则表达式语言是Emacs Style,如此处所述:https://www.emacswiki.org/emacs/RegularExpression。您可以使用-regextype
更改正则表达式语言。
答案 1 :(得分:1)
要将表达式与仅一个可选字符匹配,请尝试使用or
选项:
touch abc ac abbc
find . -name "a?c" -or -name "ac"
仅给您:abc
和ac
的名字。
通常,您可以使用or
和and
选项=)构建非常复杂的查找查询
答案 2 :(得分:1)
find -name
选项使用全局模式,与正则表达式不同。对于glob,?
表示任何单个字符。如果希望字符为可选字符,则需要使用两种模式:
find ./ -name abc -o -name ac
答案 3 :(得分:0)
其他答案足以解决问题,但了解find
的{{1}}选项在整个条目中是否匹配是至关重要的。因此,您不能只进行部分匹配:
-regex
您必须使用一两个点星:
-regex 'ab?c'
如果没有通配符,也可以使用-regex '.*ab?c.*'
:
grep