如何grep整个单词
Posted
技术标签:
【中文标题】如何grep整个单词【英文标题】:How to grep for the whole word 【发布时间】: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:text
和name
应该在同一行......
【问题讨论】:
有没有人读到标题为“如何为整个世界 grep”? @Earlz,不,主要是因为我在 Google 上搜索了“grep whole word”。 【参考方案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
表达式,或者使用正则表达式仅过滤您需要的元素。
【讨论】:
如果“文本”在输出的末尾怎么办?在您的解决方案中不会跳过它吗?以上是关于如何grep整个单词的主要内容,如果未能解决你的问题,请参考以下文章
grep:查找包含单词`star`但不包含单词`start`的所有文件