我有很多 .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.testProlog
和carlmann_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