grep负向后看(在macOS上)

时间:2018-09-15 16:09:36

标签: macos grep negative-lookbehind

我正在使用一个SQL脚本目录,并尝试查找没有以JOIN或FROM开头的tables.table的任何提及(因为我试图确定哪些脚本实际上可以修改{{1} },而不是从中读取)。因此,我尝试使用一个负向后搜索,但是我想知道是否不能在tables.table macOS上实现它,因为它对我不起作用。这是我正在使用的:

grep

MacOS正在打印:

grep -r "(?!JOIN )tables.table"

我正在运行10.13.16 macOS High Sierra,以防万一。我的问题是:

(1)我是否可以对macOS进行隐式后视,如果可以,该如何做? (2)如何在包含“或”的后面进行否定查找(因为我想查找JOIN和FROM都不在-bash: !JOIN: event not found 之前的实例。

****编辑****

我将尝试通过生成示例示例文件并更详细地解释该问题来提供MCVE(我之前已经在上面提到过)。我有一个包含SQL脚本的庞大且非常深入的目录集(有时向下4-5个目录级别)。我对这些SQL脚本不熟悉,但已被要求尝试确定哪些SQL脚本会修改特定的表。为此,我想递归地找到所有嵌套在各种目录和子目录中的所有这些SQL文件中的字符串,这些目录和子目录中都提到了特定的表(我们称其为table.tables),但前提是该表的名称前面没有单词JOIN或FROM,因为它表示它是数据源且未被修改。

因此,假设我有以下文件集(及其路径名):

tables.table,其中包含以下文本:

/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,并且这是我上面返回的唯一结果。

我愿意接受有关如何完成此操作的所有建议。再次感谢。

1 个答案:

答案 0 :(得分:0)

您还没有提供MCVE,所以我猜测是这个脚本,它只是测试JOIN或FROM是否出现在与tables.table相同的行上的任何地方。

awk '!/JOIN|FROM/ && /tables\.table/' file

或者如果您确实需要检查 tables.table之前的JOIN或FROM:

awk 's=index($0,"tables.table") && substr($0,1,s-1)!~/JOIN|FROM/' file

这些脚本中的每个脚本在每个UNIX系统上的任何shell中都可以使用任何awk一致地运行。如果您既不想执行任何操作,也可以编辑问题以包括缺少的MCVE。