【问题标题】:How to grep for the whole word如何grep整个单词
【发布时间】:2011-02-22 04:09:01
【问题描述】:

我正在使用以下命令来 grep 子目录中的内容

find . | xargs grep -s 's:text'

不过,这也会找到像 <s:textfield name="sdfsf"...../> 这样的东西

我能做些什么来避免这种情况,所以它只会找到像 <s:text name="sdfsdf"/> 这样的东西

或者就此而言....还找到<s:text somethingElse="lkjkj" name="lkkj"

基本上s:textname 应该在同一行......

【问题讨论】:

  • 有没有人读到标题为“如何为整个世界 grep”?
  • @Earlz,不,主要是因为我在 Google 上搜索了“grep whole word”。

标签: unix grep


【解决方案1】:

使用-w 选项进行全词匹配。示例如下:

[binita@ubuntu ~]# a="abcd efg"
[binita@ubuntu ~]# echo $a
abcd efg
[binita@ubuntu ~]# echo $a | grep ab
abcd efg
[binita@ubuntu ~]# echo $a | grep -w  ab
[binita@ubuntu ~]# echo $a | grep -w  abcd
abcd efg

【讨论】:

    【解决方案2】:

    这是另一种设置单词边界的方法,请注意,如果没有引号,它就不起作用:

    grep -r '\<s:text\>' .

    【讨论】:

      【解决方案3】:

      你可以试试 rg,https://github.com/BurntSushi/ripgrep

      rg -w 's:text' . 
      

      应该这样做

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
      • 我确实提供了答案:rg -w 's:text' 。
      • 建议使用非标准工具可能还有其他原因,但作为一个关于如何使用标准 grep 解决此问题的解决方案,这并不是特别引人注目或令人满意,尤其是考虑到 grep有同样的选择。
      • 这取决于directi有多深和多胖
      • 这取决于文件的数量,ripgrep 可以更快,并且 find->xargs 为每个文件创建一个新进程。
      【解决方案4】:

      使用\b 匹配“单词边界”,这将使您的搜索仅匹配整个单词。

      所以你的 grep 看起来像

      grep -r "\bSTRING\b"
      

      添加颜色和行号也可能有帮助

      grep --color -rn "\bSTRING\b"
      

      来自http://www.regular-expressions.info/wordboundaries.html

      有资格作为单词边界的三个不同位置:

      • 在字符串的第一个字符之前,如果第一个字符是 字字符。
      • 在字符串的最后一个字符之后,如果最后一个 字符是一个单词字符。
      • 在字符串中的两个字符之间, 其中一个是单词字符,另一个不是单词字符。

      【讨论】:

        【解决方案5】:

        您可以通过 grep 递归搜索来删除 xargs 命令。而且你通常不需要's'标志。因此:

        grep -wr 's:text' 
        

        【讨论】:

          【解决方案6】:

          您希望-w 选项指定它是单词的结尾。

          find . | xargs grep -sw 's:text'

          【讨论】:

          • 那么,s 参数有什么作用?
          • @MawgsaysreinstateMonica 禁止显示错误消息。尝试 grep --help,将提供有关有效选项的信息
          【解决方案7】:

          如果你只是想过滤掉剩余的文本部分,你可以这样做。

          xargs grep -s 's:text '

          这应该只找到s:text 在最后一个 t 之后有空格的实例。如果您需要查找只有 name 元素的 s:text 实例,请将结果通过管道传递给另一个 grep 表达式,或者使用正则表达式仅过滤您需要的元素。

          【讨论】:

          • 如果“文本”在输出的末尾怎么办?在您的解决方案中不会跳过它吗?
          猜你喜欢
          • 2013-07-11
          • 2011-05-31
          • 1970-01-01
          • 1970-01-01
          • 2016-04-07
          • 1970-01-01
          • 2023-01-13
          • 1970-01-01
          • 2016-05-08
          相关资源
          最近更新 更多