gpt4 book ai didi

正则表达式用于匹配管道恰好 n 倍的行

转载 作者:行者123 更新时间:2023-12-04 05:56:09 25 4
gpt4 key购买 nike

我正在使用 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com