如何为整个单词grep

时间:2010-05-21 01:41:50

标签: unix grep

我使用以下命令来grep子目录中的东西

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

但是,这也会找到像<s:textfield name="sdfsf"...../>

这样的内容

我可以做些什么来避免这种情况,因此它只会找到像<s:text name="sdfsdf"/>

这样的内容

OR就此而言......也找到了<s:text somethingElse="lkjkj" name="lkkj"

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

6 个答案:

答案 0 :(得分:65)

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

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

答案 1 :(得分:40)

使用\b匹配&#34;字词边界&#34;,这将使您的搜索仅匹配整个单词。

所以你的grep看起来像

grep -r "\bSTRING\b"

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

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

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

  

有三种不同的职位符合词边界:

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

答案 2 :(得分:26)

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

grep -wr 's:text' 

答案 3 :(得分:1)

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

rg -w 's:text' . 

应该这样做

答案 4 :(得分:0)

如果您只想过滤掉剩余文本部分,可以执行此操作。

xargs grep -s 's:text '

这应该只找到s:text个实例,最后一个t后面有空格。如果您需要查找仅包含name元素的s:text个实例,请将结果传递给另一个grep表达式,或使用regex仅过滤所需的元素。

答案 5 :(得分:0)

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

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