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

标签 regex grep

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

    相关文章:

    regex - 量词 {0} 在某些情况下有意义吗?

    regex - 了解 Text.Regex.Posix 设计选择

    javascript - 如何在 javascript 中将正则表达式文字附加到字符串文字

    regex - Python 3 Pandas 使用 Startswith + 或选择 Dataframe

    javascript - 以逗号分隔的电子邮件 - 添加邮件长度检查(JS 正则表达式)

    shell - shell 脚本中的 grep 实用程序

    bash - 从另一个文件中删除包含 ID 的每一行

    linux - grep 的基本表达式不支持\d 吗?

    regex - 使用 Grep 在匹配之前获取捕获组和行

    parsing - 使用 `grep` 、 `awk` 、 `sed` 或任何其他有能力的内容进行简单过滤