Linux
Grep 用於基本名稱中的正則表達式,但返回全名
所以說我有一個文本文件中的文件列表:
... /foo/barfoo /bar/foo/foobar /foobar/bar/foo ...
我有一個腳本可以搜尋這個文本文件,並且很像 locate 命令,我希望能夠搜尋文件的基本名稱。到目前為止,我已經使用了這個 grep 命令
grep -E */.*${1}[^/]*$
,它工作得很好,除非我想 grep 來獲取正則表達式。因此,在上面的範例中,如果我想查找以“foo”開頭的文件,我會執行myscript --basename ^foo
但是這會失敗,因為整個正則表達式grep -E */.*^foo[^/]*$
顯然會失敗。我考慮過使用 xargs 將每個條目插入 basename,但我需要腳本在最後輸出整個文件路徑。有任何想法嗎?我更喜歡 POSIX 合規性,但 GNUisms 也很好
如果
foo
必須在基本名稱的開頭匹配:< inputfile grep '/foo[^/]*$'
/foo[^/]*$
: 匹配一個/foo
字元串,後跟任意數量的不在/
字元串末尾的任意字元if
foo
可以匹配基本名稱中的任何位置:< inputfile grep 'foo[^/]*$'
foo[^/]*$
: 匹配一個foo
字元串,後跟任意數量的不在/
字元串末尾的任意字元
如果您
grep
支持 PCRE(Perl 兼容的正則表達式):$ grep -Po '.*/\Kfoo[^/]*$' file.txt foobar foo
.*/
將匹配到最後一個/
並\K
丟棄匹配foo[^/]*$
將找到以開頭的文件名foo