我正在使用 grep 匹配具有 52 个管道 (|) 的行。我使用的 grep 命令是:
grep -nP "^(.*?\|){52}"
-P
因为懒惰修饰符 ?
否则不起作用。当我运行它时,会显示以下消息:PCRE's backtracking limit is exceeded
.我想这里的类似 perl 的正则表达式有问题。非常感谢!
最佳答案
您的 PCRE 模式(仅匹配 52 次出现的任何 0+ 字符,尽可能少,直到并包括 |
字符,并且不检查超出此范围的任何文本)包含重复的捕获组,当引擎匹配时,它还在每个 |
之前放置每个 0+ 字符和 |
char 成一个组,然后在每次迭代时重写该值。在某些实现中,它会导致您提供的错误。
请注意,该任务不需要 PCRE 正则表达式,因为要匹配除 |
之外的任何字符。您可以使用 [^|]
然后仅使用 POSIX ERE 模式(通过 -E
选项启用)和 grep
:
grep -En "^([^|]*\|){52}[^|]*$"
请注意
[^|]*$
最后添加。它匹配除 |
之外的任何 0+ 个字符然后断言行尾位置。所以,只有包含 53 |
的行-separated 字段匹配。否则,您可能会考虑使用 awk 解决方案(如 PS 建议的那样):
awk -F'|' '{if (NF==53) {print NR ":" $0;}}'
我们在这里检查 53
|
-separated 字段并打印行号,:
和线路本身。
关于正则表达式用于匹配管道恰好 n 倍的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50794728/