使用 grep 查找可能包含特殊字符的字符串的所有子字符串

使用 grep 查找可能包含特殊字符的字符串的所有子字符串

我正在尝试使用 grep 在文件中查找字符串“crk”。我知道该字符串以以下形式存在于 c 源文件中

kop.crk_op = CRK_MOD_EXP;

但是当我使用搜索时

 grep -rnw --include '*.c' '.' -e "crk"

我得到了一个空的结果。

 grep -rnw --include '*.c' '.' -e "crk_op"

效果很好,但对我没什么帮助。我猜“_”字符在某种程度上搞乱了我的搜索。我该如何修改我的方法来匹配所有以“crk”为子字符串的字符串,即使存在“_”字符或任何其他字符?

编辑:看来我在这个帖子上有点冲动了。命令

grep -rnw --include '*.c' '.' -e "[^ ]*crk[^ ]*"

似乎有效。或者,有人能解释一下为什么需要额外的通配符吗?

答案1

-w选项使 grep 查找单词,因此crk当单词被非单词字符包围时,它将显示出来。从man grep

-w,——单词-正则表达式
      仅选择包含组成整个的匹配项的行
      单词。测试是匹配的子字符串必须是
      在行首,或以非单词开头
      组成字符。同样,它必须位于末尾
      或者后面跟着一个非单词组成字符。
      组成单词的字符包括字母、数字和
      下划线。

_是单词字符,因此crk_op不会crk与匹配-w

这个复杂的正则表达式"[^ ]*crk[^ ]*"之所以有效,是因为它允许 grep 所需的单词边界之间有任意数量的非空格字符。

做就是了:

grep -rn --include '*.c' . -e crk

您不需要.在那里引用当前目录。

相关内容