由于 bash 通配符,无法确定 grep 的输出

由于 bash 通配符,无法确定 grep 的输出

我正在尝试更好地理解 bash 命令。

ls /usr/include/ | grep \.h

它应该列出所有以 .h 结尾的文件(C 库),但它的输出超出预期。

读取数据库。H

频道应收账。H

内塔

如果有人还能告诉我如何将问题中的 .h 加粗而不将其与名称的其余部分用空格隔开,我会很感激。

答案1

在 中grep,您的模式匹配行中的任意位置.h(后跟 的任何字符h),而不仅仅是在行尾。

你基本上有两个问题:

  1. 引用/转义问题

  2. 正则表达式模式问题

解释:

  1. 您已.使用 进行转义\.,并且未使用任何引号或其他\,因此转义将逃避 shell,并将grep获得正则表达式模式为.h,在正则表达式术语中,这意味着任何字符后跟h。 您的目标是使grep处理.文字,因此您需要引用或添加另一个,\例如:

    '\.h'
    \\.h
    
  2. 现在第二个问题,在正则表达式中,行的结束由量词表示$,因此您需要.h在行末尾匹配:

    '\.h$'
    

因此,正确的用法应该是:

ls /usr/include/ | grep '\.h$'

现在最重要的是不要解析ls

您正在做的事情可以通过基本的 shell 通配符轻松高效地完成:

ls /usr/include/*.h

相关内容