我正在使用以下命令来 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
应该在同一行......
您需要
-w
选项来指定它是单词的结尾。
find . | xargs grep -sw 's:text'
使用
\b
匹配“单词边界”,这将使您的搜索仅匹配整个单词。
所以你的 grep 看起来像这样
grep -r "\bSTRING\b"
添加颜色和行号也可能有帮助
grep --color -rn "\bSTRING\b"
来自 http://www.regular-expressions.info/wordboundaries.html:
存在三种不同的位置可以作为单词边界:
- 在字符串中的第一个字符之前,如果第一个字符是 单词字符。
- 在字符串中的最后一个字符之后,如果最后一个 字符是单词字符。
- 字符串中的两个字符之间, 其中一个是单词字符,另一个不是单词字符。
您可以通过递归进行 grep 搜索来删除
xargs
命令。通常您不需要 's' 标志。因此:
grep -wr '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
这是设置单词边界的另一种方法,请注意,如果没有引号,它就不起作用:
grep -r '\<s:text\>' .
如果你只是想过滤掉剩余的文本部分,你可以这样做。
xargs grep -s 's:text '
这应该只找到最后一个 t 之后有空格的
s:text
实例。如果您需要查找仅具有名称元素的 s:text
实例,请将结果通过管道传输到另一个 grep
表达式,或使用正则表达式仅过滤您需要的元素。