How to grep for the whole word

我使用以下命令在 subdirs 中对内容进行 grep

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

然而,这也能找到像 <s:textfield name="sdfsf"...../>这样的东西吗

我能做什么来避免这一点,所以它只是发现像 <s:text name="sdfsdf"/>的东西

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

basically s:text and name should be on same line....

134635 次浏览

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

xargs grep -s 's:text '

这应该只能找到在最后一个 t 之后有空格的 s:text实例。如果需要找到只有 name 元素的 s:text实例,可以将结果传送到另一个 grep表达式,或者使用 regex 仅筛选所需的元素。

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

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

您可以通过使用 grep 搜索递归地删除 xargs命令。而且您通常不需要“ s”标志。因此:

grep -wr 's:text'

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

所以你的手势看起来就像

grep -r "\bSTRING\b"

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

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

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

有三种不同的位置符合词语界限:

  • 在字符串中的第一个字符之前,如果第一个字符是 文字特征。
  • 在字符串的最后一个字符之后,如果最后一个 字符是一个单词字符。
  • 在字符串中的两个字符之间, where one is a word character and the other is not a word character.

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

rg -w 's:text' .

应该可以

This is another way of setting the boundaries of the word, note that it doesn't work without the quotes around it:

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

使用 -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