我正在尝试更好地理解 bash 命令。
ls /usr/include/ | grep \.h
它应该列出所有以 .h 结尾的文件(C 库),但它的输出超出预期。
日读取数据库。H
你频道应收账。H
内塔什
如果有人还能告诉我如何将问题中的 .h 加粗而不将其与名称的其余部分用空格隔开,我会很感激。
答案1
在 中grep
,您的模式匹配行中的任意位置.h
(后跟 的任何字符h
),而不仅仅是在行尾。
你基本上有两个问题:
引用/转义问题
正则表达式模式问题
解释:
您已
.
使用 进行转义\.
,并且未使用任何引号或其他\
,因此转义将逃避 shell,并将grep
获得正则表达式模式为.h
,在正则表达式术语中,这意味着任何字符后跟h
。 您的目标是使grep
处理.
文字,因此您需要引用或添加另一个,\
例如:'\.h' \\.h
现在第二个问题,在正则表达式中,行的结束由量词表示
$
,因此您需要.h
在行末尾匹配:'\.h$'
因此,正确的用法应该是:
ls /usr/include/ | grep '\.h$'
现在最重要的是不要解析ls
。
您正在做的事情可以通过基本的 shell 通配符轻松高效地完成:
ls /usr/include/*.h