为什么简单使用 grep 没有得到任何结果?

为什么简单使用 grep 没有得到任何结果?

我使用 find 制作了一个文本文件,其中包含外部硬盘上的所有内容,扩展名为 .mp3 和 .wma。我想尝试对文件使用 grep,以便查看没有前面目录的文件(只有行本身,看起来不会那么混乱)。但是,当我输入以下内容时:

grep -h "*.mp3" mp3sCIR.txt 

什么都没弹出。是的,拼写正确,文件确实包含列表。我尝试删除 -h,但仍然没有结果。Egrep 可以工作,但不会像要求的那样抑制文件名/路径。

答案1

首先,您似乎误解了该-h标志的作用。

-h将隐藏在命令行上传递的文件的名称(即mp3sCIR.txt- 尽管当只给出一个文件时,默认情况下不会打印名称) - 它不会从文件名称中删除任何内容里面文件。

其次,你混淆了 shell 模式(又名 'globs')和正则表达式 - grep 使用正则表达式语法,因此要匹配带有.mp3扩展名的文件名,你需要1

grep ".*\.mp3" mp3sCIR.txt 

(无论有没有 ,其工作方式都应该相同-E,因为基本形式和扩展形式是相同的)。

要删除前导路径名组件(即您尝试执行的操作-h),您可以使用

grep -o "[^/]*\.mp3"  mp3sCIR.txt

打印o仅匹配部分不包括路径分隔符,或者使用 perl 兼容 (PCRE) 模式下的 grep

grep -Po ".*/\K.*\.mp3" mp3sCIR.txt


供将来参考,你可以已保存find使用的输出格式来表示不带前导路径组件的名称-printf '%f\n'


*[1] 实际上,BRE 将模式开头的裸字符视为文字,而ERE(即egrep/ grep -E)似乎将其视为空表达式的量词(“零个或多个无内容的实例”);因此grep -E "*.mp3" 匹配带有后缀的条目.mp3- 但原因可能与您想的不一样。

相关内容