Grep match 查找除已知字符串之外的正则表达式匹配项

Grep match 查找除已知字符串之外的正则表达式匹配项

我有很多 .sql 文件,其中很多文件都使用我编写的名为“carlmann_demo”的包。任何使用此类包的文件都会执行如下操作:

-- This line will be present in every file that uses carlmann_demo
exec carlmann_demo.testProlog;

-- Uses of carlmann_demo other than testProlog, testEpilog like the ones below are optional
carlmann_demo.releaseReport;
carlmann_demo.canBeAnything;

-- This line will be present in every file that uses carlmann_demo
exec carlmann_demo.testEpilog;

我想做的是想出一种方法来列出具有“carlmann_demo”可选用途的文件(即有与 carlmann_demo.* 匹配的单词,除了“carlmann_demo.testProlog”、“carlmann_demo.testEpilog”)。

我尝试了如下方法但没有成功,因为它列出了所有使用 carlmann_demo 的文件:

grep -sRl "carlmann_demo" | grep -v "carlmann_demo.testEpilog" | grep -v "carlmann_demo.testProlog"

我很确定这可以通过 grep 在终端上完成,但到目前为止我还没有成功。

任何帮助,将不胜感激!

答案1

您可以用空字符串替换所有出现的carlmann_demo.testPrologcarlmann_demo.testEpilog,然后才搜索carlmann_demo.

find . -type f -name '*.sql' -exec sh -c '
    <"$1" sed "s/carlmann_demo\.testProlog//g; s/carlmann_demo\.testEpilog//g" \
    | grep -qF "carlmann_demo."
' find-sh {} \; -print

笔记:

  • sh该解决方案对每个测试文件运行一次。这很慢,可以通过-exec … +更复杂的 shell 代码(包括循环和条件打印文件名)来改进。我决定保持简单;这样,您可以在之后添加更多测试,或者在需要时-exec使用-print0而不是。-print
  • 如果您的grep支持-m随后使用-m 1使其在第一次匹配后退出。额外的匹配无法改变结果,因此第一次匹配之后的处理是徒劳的。
  • 在正则表达式中,点 ( ) 几乎可以匹配任何字符。这就是我的脚本中(使用固定字符串匹配) 和(转义点)背后的.原因。grep -F\.sed

相关内容