通过 grep [重复] 查找始终位于模式下方一行的 ID 的精确匹配

通过 grep [重复] 查找始终位于模式下方一行的 ID 的精确匹配

我想知道grep一个接一个地检查两个匹配的代码。例如,我从其中一个搜索文件中获得以下文本:

@<TRIPOS>MOLECULE   ← pattern
1532                ← ID
17 17
SMALL
NO_CHARGES

我需要找到ID 的精确匹配始终位于模式下方一行然后检索 ID 所在的文件名。

我使用了以下命令:

grep -Pzo '@<TRIPOS>MOLECULE'(?:.*\n)*?\K1532' filename

但我得到了包含 1532 和 153284 的文件。我需要精确 ID 匹配的代码。

答案1

您的模式正在寻找,1532但没有说明之后会发生什么:

$ printf '1532\n15321\n1532foo\n' | grep -o '1532'
1532
1532
1532

根据您想要执行的操作,您可以将模式限制为仅在换行符之前匹配:

grep -Pzo '@<TRIPOS>MOLECULE(?:.*\n)*?\K1532\n' filename

或者,如果行尾之前的数字后面可以有空格:

grep -Pzo '@<TRIPOS>MOLECULE(?:.*\n)*?\K1532\s*\n' filename

或者,如果同一行上可以有其他内容,请使用\b以确保数字出现在字边界之前:

grep -Pzo '@<TRIPOS>MOLECULE(?:.*\n)*?\K1532\b' filename

相关内容