我正在使用的命令:
find . -type f -name "*.sql" -exec grep -i -l 'schema_name.' {} +
我要搜索的是所有包含schema_name.
.但 find 命令忽略了最后一个.
,只是寻找schema_name
而不是schema_name.
答案1
这是grep
问题,不是find
。
grep
默认使用正则表达式匹配模式,模式schema_name.
表示字符串后面的任何字符schema_name
。
如果你想从字面上匹配点.
,你必须用反斜杠转义它\
:
find . -type f -name "*.sql" -exec grep -il 'schema_name\.' {} +
或使用-F
选项:
find . -type f -name "*.sql" -exec grep -Fil 'schema_name.' {} +
答案2
你可以使用 fgrep
find . -type f -name "*.sql" -exec fgrep -i -l 'schema_name.' {} +
在较旧的 Unix 操作系统上可能会快得多(fgrep、grep 和 egrep 曾经是 3 个不同的可执行文件,并且 fgrep 速度要快得多,因为它完全省略了与正则表达式相关的所有内容 - 例如在基于 GNU 的系统上这三个程序只是指向同一可执行文件的链接)。
答案3
转义搜索模式中的点grep
:
find . -type f -name "*.sql" -exec grep -i -l 'schema_name\.' {} +
答案4
为什么 grep 命令忽略搜索字符串中的句点?
事实并非如此。
为了证明,运行
grep . file
这是从 中删除所有空行的简单方法file
。
换句话说,.
是任何单个字符(换行符除外)的正则表达式原子。要从字面上匹配点,原子必须转义为\.