为什么 grep 命令忽略搜索字符串中的句点?

为什么 grep 命令忽略搜索字符串中的句点?

我正在使用的命令:

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

换句话说,.是任何单个字符(换行符除外)的正则表达式原子。要从字面上匹配点,原子必须转义为\.

相关内容