如何 grep 查找整个单词

问题描述 投票:0回答:7

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

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

但是,这也会找到类似

<s:textfield name="sdfsf"...../>

的内容

我能做些什么来避免这种情况,这样它只会找到像

<s:text name="sdfsdf"/>

这样的东西

OR 就此而言....还发现

<s:text somethingElse="lkjkj" name="lkkj"

基本上

s:text
name
应该在同一行......

unix grep exact-match
7个回答
154
投票

您需要

-w
选项来指定它是单词的结尾。

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


111
投票

使用

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

所以你的 grep 看起来像这样

grep -r "\bSTRING\b"

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

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

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

存在三种不同的位置可以作为单词边界:

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

33
投票

您可以通过递归进行 grep 搜索来删除

xargs
命令。通常您不需要 's' 标志。因此:

grep -wr 's:text' 

11
投票

使用

-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

4
投票

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

rg -w 's:text' . 

应该这样做


1
投票

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

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


0
投票

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

xargs grep -s 's:text '

这应该只找到最后一个 t 之后有空格的

s:text
实例。如果您需要查找仅具有名称元素的
s:text
实例,请将结果通过管道传输到另一个
grep
表达式,或使用正则表达式仅过滤您需要的元素。

© www.soinside.com 2019 - 2024. All rights reserved.