我有以下文件,需要对它们进行如下匹配:
./foo.bar1.sh -match
./qux/foo.bar2.sh -match
./foo.sh -match
./baz.sh -no match
./foo.bar3 -no match
我努力了:
find . -regex ".*foo(bar[0-9])?\.sh"
但它没有返回任何内容。我不明白为什么该正则表达式不起作用。
答案1
您的正则表达式有两个错误:
后面少了一个(文字上的)点
foo
。find
要求您在以下情况下转义括号:不是用作文字括号。
另外,您应该对 之前的点进行转义sh
,因为它可以匹配任何字符。
修复后的命令现在内容如下:
find . -regex ".*foo\(\.bar[0-9]\)?\.sh"
find
顺便说一下,错误 2. 是我不喜欢 开关的原因-regex
:转义不一致。
当然,它是有效的,但是grep -P
使用 Perl 兼容正则表达式 (PCRE),因此功能更多,但意外和陷阱更少。
就我个人而言,我会使用:
find . | grep -P "foo(\.bar\d)?\.sh"