如何全词重复


82

我正在使用以下命令在子目录中grep东西

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

但是,这也会发现类似 <s:textfield name="sdfsf"...../>

我应该怎么做才能避免这种情况,所以它只会发现类似 <s:text name="sdfsdf"/>

或为此...。也发现 <s:text somethingElse="lkjkj" name="lkkj"

基本上s:text并且name应该在同一行....


29
有没有人读过“如何为整个世界发展”的标题?
Earlz

14
@Earlz,不,主要是因为我用Google搜索了“ grep全字”。
路加福音

Answers:


99

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

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


66

使用\b相匹配的“字边界”,这将使得在全字搜索匹配。

所以你的grep看起来像

grep -r "\bSTRING\b"

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

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

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

有三个不同的位置可以作为单词边界:

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

28

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

grep -wr 's:text' 

1

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

rg -w 's:text' . 

应该做


尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会无效。-来自评论
Jibin Balachandran

3
我确实提供了答案:rg -w's:text'。
ms4720 '17

1
可能还有其他原因建议使用非标准工具,但是作为解决有关如何使用标准工具解决此问题的解决方案,grep这并不是特别令人信服或令人满意的,尤其是考虑到grep具有相同选择的情况。
4

这取决于
指令的

这取决于文件的数量,ripgrep可以更快,并且find-> xargs为每个文件创建一个新进程。
ms4720

0

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

xargs grep -s 's:text '

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


如果“文本”位于输出的末尾怎么办?您的解决方案中不会跳过吗?
pkuszewski 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.