我使用 grep 来匹配恰好有 52 个管道 (|) 的行。我使用的 grep 命令是:
grep -nP "^(.*?\|){52}"
Run Code Online (Sandbox Code Playgroud)
-P因为lazy修饰符?在其他情况下不起作用。当我运行此命令时,会显示以下消息:PCRE's backtracking limit is exceeded。我猜这里类似 perl 的正则表达式有问题。
多谢!
您的 PCRE 模式(仅匹配任何 0+ 字符的 52 次出现,尽可能少,直到并包括|char,并且不检查超出该范围的任何文本)包含重复的捕获组,当引擎匹配时,它还会将每个每个之前有 0+ 个字符,|并将该|字符放入一个组中,然后在每次迭代时重写该值。在某些实现中,它会导致您提供的错误。
请注意,您不需要 PCRE 正则表达式来执行任务,因为要匹配任何字符,但|您可以使用[^|]然后使用纯粹的 POSIX ERE 模式(通过-E选项启用)grep:
grep -En "^([^|]*\|){52}[^|]*$"
Run Code Online (Sandbox Code Playgroud)
注意[^|]*$最后添加的。它匹配除 之外的任何 0+ 字符|,然后断言行尾位置。因此,仅|匹配包含 53 个分隔字段的行。
否则,您可以考虑使用 awk 解决方案(如 PS 建议的那样):
awk -F'|' '{if (NF==53) {print NR ":" $0;}}'
Run Code Online (Sandbox Code Playgroud)
我们检查 53 个|分隔字段并打印行号:和行本身。