![为什么简单使用 grep 没有得到任何结果?](https://linux22.com/image/885603/%E4%B8%BA%E4%BB%80%E4%B9%88%E7%AE%80%E5%8D%95%E4%BD%BF%E7%94%A8%20grep%20%E6%B2%A1%E6%9C%89%E5%BE%97%E5%88%B0%E4%BB%BB%E4%BD%95%E7%BB%93%E6%9E%9C%EF%BC%9F.png)
我使用 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
- 但原因可能与您想的不一样。