Linux

Grep 用於基本名稱中的正則表達式,但返回全名

  • June 19, 2015

所以說我有一個文本文件中的文件列表:

...
/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字元串,後跟任意數量的不在/字元串末尾的任意字元

iffoo可以匹配基本名稱中的任何位置:

< inputfile grep 'foo[^/]*$'
  • foo[^/]*$: 匹配一個foo字元串,後跟任意數量的不在/字元串末尾的任意字元

如果您grep支持 PCRE(Perl 兼容的正則表達式):

$ grep -Po '.*/\Kfoo[^/]*$' file.txt 
foobar
foo
  • .*/將匹配到最後一個/\K丟棄匹配
  • foo[^/]*$將找到以開頭的文件名foo

引用自:https://unix.stackexchange.com/questions/210872