gpt4 book ai didi

regex - 如何让 "grep -zoP"分别显示每个匹配项?

转载 作者:行者123 更新时间:2023-12-03 15:18:41 24 4
gpt4 key购买 nike

我在这个表格上有一个文件:

X/this is the first match/blabla
X-this is
the second match-

and here we have some fluff.
我想提取出现在“X”之后和相同标记之间的所有内容。所以如果我有“X+match+”,我想得到“match”,因为它出现在“X”之后和标记“+”之间。
因此,对于给定的示例文件,我希望得到以下输出:
this is the first match
进而
this is
the second match
我设法使用以下方法获取 X 和标记之间的所有内容:
grep -zPo '(?<=X(.))(.|\n)+(?=\1)' file
那是:
  • grep -Po '(?<=X(.))(.|\n)+(?=\1)'匹配 X 后跟 (something)最后被捕获并与 (?=\1) 匹配(我基于 my answer here 的代码)。
  • 注意我使用 (.|\n)匹配任何内容,包括新行,我也使用 -z在 grep 中也匹配新行。

  • 所以这很有效,唯一的问题来自输出的显示:
    $ grep -zPo '(?<=X(.))(.|\n)+(?=\1)' file
    this is the first matchthis is
    the second match
    如您所见,所有匹配项一起出现,“这是第一个匹配项”后跟“这是第二个匹配项”,完全没有分隔符。我知道这来自“-z”的使用,它将所有文件视为一组行,每行都以零字节(ASCII NUL 字符)而不是换行符(引用“man grep”)结尾。
    那么:有没有办法分别获得所有这些结果?
    我也在 GNU Awk 中尝试过:
    awk 'match($0, /X(.)(\n|.*)\1/, a) {print a[1]}' file
    但甚至不是 (\n|.*)工作。

    最佳答案

    awk不支持正则表达式定义中的反向引用。
    解决方法:

    $ grep -zPo '(?s)(?<=X(.)).+(?=\1)' ip.txt | tr '\0' '\n'
    this is the first match
    this is
    the second match

    # with ripgrep, which supports multiline matching
    $ rg -NoUP '(?s)(?<=X(.)).+(?=\1)' ip.txt
    this is the first match
    this is
    the second match
    也可以用 (?s)X(.)\K.+(?=\1)而不是 (?s)(?<=X(.)).+(?=\1) .此外,您可能希望在此处使用非贪婪量词以避免匹配 match+xyz+foobaz对于输入 X+match+xyz+foobaz+
    perl
    $ perl -0777 -nE 'say $& while(/X(.)\K.+(?=\1)/sg)' ip.txt
    this is the first match
    this is
    the second match

    关于regex - 如何让 "grep -zoP"分别显示每个匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64968569/

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