我想知道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