我正在尝试使用 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
您不需要.
在那里引用当前目录。