我正在使用一个SQL脚本目录,并试图找到任何前面都没有提到的tables.table (因为我试图识别哪些脚本可能实际上修改了tables.table,而不是从中读取)。因此,我试图使用一个负外观的,但我想知道这是否只是没有在macOS grep上实现,因为它不适合我。我用的是:
grep -r "(?!JOIN )tables.table"MacOS正在打印:
-bash: !JOIN: event not found我是运行10.13.16 macOS高塞拉利昂,以防止它造成影响。我的问题是:
(1)我能用macOS做负查找吗?如果是的话,如何做?(2)如何进行包括“或”在内的负查找(因为我想找到既不加入也不从tables.table前面查找的意图。
编辑*
我将尝试通过生成示例文件并更详细地解释问题来提供一个MCVE (我认为我在上面有)。我有一个包含SQL脚本的大量和非常深的目录集(有时是4-5个目录级别)。我对这些SQL脚本并不熟悉,但有人要求我识别哪些SQL脚本修改了特定的表。为此,我希望在所有这些SQL文件中递归地查找字符串,这些文件嵌套在各种目录和子目录中,这些目录和子目录中都提到了特定的表(让我们称之为table.tables),但前提是该表的名称前面没有单词JOIN或FROM,因为这表明它是数据源,没有被修改。
因此,假设我有以下一组文件(有它们的路径名):
/scripts/analysisA/prod/script.SQL,它包含以下文本:
blah blah blah
FROM table.tables/scripts/analysisB/script2.SQL,它包含以下文本:
blah blah blah
INNER JOIN table.tables/scripts/script3.SQL,它包含以下文本:
UPDATE table.tables
blah blah blah然后,我希望返回的结果是/scripts/script3.SQL包含行UPDATE table.tables,这是我唯一返回的上述结果。
对于如何做到这一点,我愿意听取所有的建议。再次感谢。
发布于 2018-09-16 01:30:30
您还没有提供MCVE,所以我猜,但是这个脚本只需要测试JOIN或从哪个位置出现在与tables.table相同的行上,这可能就是您所需要的:
awk '!/JOIN|FROM/ && /tables\.table/' file或者,如果您确实需要在之前检查JOIN或FROM,请在tables.table之前检查:
awk 's=index($0,"tables.table") && substr($0,1,s-1)!~/JOIN|FROM/' file每个脚本都将在每个UNIX系统上使用任何shell中的任何awk一致地运行。如果没有你想要的,然后编辑你的问题,包括缺失的MCVE。
https://stackoverflow.com/questions/52346483
复制相似问题