Grep 查找基名中的正则表达式,但返回全名

Grep 查找基名中的正则表达式,但返回全名

假设我有一个文本文件中的文件列表:

...
/foo/barfoo
/bar/foo/foobar
/foobar/bar/foo
...

我有一个脚本可以搜索这个文本文件,就像locate 命令一样,我希望能够搜索文件的基本名称。到目前为止,我已经使用了这个 grep 命令grep -E */.*${1}[^/]*$,它工作得很好,除非我想 grep 查找正则表达式。因此,在上面的示例中,如果我想查找以“foo”开头的文件,我会执行,myscript --basename ^foo但是这会失败,因为整个正则表达式grep -E */.*^foo[^/]*$显然会失败。我考虑过使用 xargs 将每个条目插入基本名称中,但我需要脚本在末尾输出整个文件路径。

有任何想法吗?我更喜欢 POSIX 合规性,但 GNUisms 也很好

答案1

如果foo必须在基本名称的开头匹配:

< inputfile grep '/foo[^/]*$'
  • /foo[^/]*$:匹配一个/foo字符串,后跟任意数量的不在/字符串末尾的字符

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

< inputfile grep 'foo[^/]*$'
  • foo[^/]*$:匹配一个foo字符串,后跟任意数量的不在/字符串末尾的字符

答案2

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

$ grep -Po '.*/\Kfoo[^/]*$' file.txt 
foobar
foo
  • .*/将匹配到最后一个/\K放弃匹配

  • foo[^/]*$将找到以以下内容开头的文件名foo

相关内容