
我有以下文件,需要將它們匹配:
./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. 是我不喜歡's switch的原因-regex
:轉義不一致。
當然,它可以工作,但grep -P
使用 Perl 相容正規表示式 (PCRE),因此有更多功能,但驚喜和陷阱較少。
就我個人而言,我會使用:
find . | grep -P "foo(\.bar\d)?\.sh"