假设我有一个文本文件中的文件列表:
...
/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