【问题标题】:grep -P recursion match whole linegrep -P 递归匹配整行
【发布时间】:2021-02-28 12:52:24
【问题描述】:

我正在尝试编写一个 grep -P 命令,该命令输出 test.txt 中仅包含字符 A 和 B 的行,这样正好有 n 个 A 后跟正好 n 个 B,没有其他字符。例如AABB AAABBB AB AAAABBBB

test.txt 是一个包含一堆模式的文件,每行一个。

我遇到了https://www.regular-expressions.info/recurse.html?wlr=1 的页面

grep -P 'A(?R)?B' test.txt

会起作用。在 Regex101 中进行测试时,这种模式确实有效。

但是,当我在终端上测试命令时,显然该命令也匹配包含此模式的行,例如ABABAB ABBAAABBBB

鉴于此,我尝试了以下方法,但它不像正则表达式那样工作。

grep -P '^A(?R)?B$' test.txt

所以我的问题是如何让 grep -P 匹配整行?我在手册页上找到了一些关于修饰符的内容,但到目前为止它并没有把我带到任何地方。

【问题讨论】:

    标签: regex grep pcre


    【解决方案1】:

    您可以使用锚点并使用subroutine (?1) 递归第一个子模式。

    使用(?R) 递归entire pattern

    grep -P '^(A(?1)*B)$' test.txt
    

    【讨论】:

    • 你也可以使用-x选项匹配grep中的整行
    • @Sundeep 我实际上无法与-x 一起使用grep -Px 'A(?R)?B'。见demo
    • @WiktorStribiżew 是的,这对我也不起作用。grep -xP '(A(?1)?B)' 有效
    猜你喜欢
    • 2013-04-14
    • 2012-06-29
    • 2011-06-10
    • 2019-01-12
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2021-10-16
    • 2013-02-16
    相关资源
    最近更新 更多