Pcregrep 复制匹配的多行模式?

Pcregrep duplicating matching multi-line patterns?

我有一个包含 2 行样本 DNA 序列的文本文件,使用 pcregrep,我想找到匹配“CCC”的模式,尤其是跨越多行的模式 (请参阅下面 test.txt 中第 1 行的结尾到第 2 行的开头) .

test.txt:

AGAGUGGCAAUAUGCGUAUAACGAUUAUUCUGGUCGCACCCGCCAGAGCAGAAAAUAUUGGGGCAGCGCC
CAUGCUGGGUCGCACAUGGAUCUGGUGAUAUUAUUGAUAAUAUUAAAGUUUUCCCGACAUUGGCUGAAUA

使用命令:

pcregrep -M --color "C[\n]?C[\n]?C" test.txt

Returns:

AGAGUGGCAAUAUGCGUAUAACGAUUAUUCUGGUCGCA**CCC**GCCAGAGCAGAAAAUAUUGGGGCAGCG**CC**

**C**CAUGCUGGGUCGCACAUGGAUCUGGUGAUAUUAUUGAUAAUAUUAAAGUUUU**CCC**GACAUUGGCUGAAUA

它似乎正确地突出显示了第 1 行中的 2 个 C,但是,它突出显示了第 2 行中的第一个 C,然后继续打印出第二行;给我一个 C 的副本。

我在这里做错了什么,如何避免第 2 行中 'C' 的重复?

试试这个:

pcregrep -M --color "(?<!C)(C\RCC|CC\RC)(?!C)" test.txt

我假设您只想找到 3 个 C 且不多于 3 个 C 是可能的。如果那不可能,或者您不关心匹配超过 3C 的内容,您可以改用这个更简单的正则表达式:

pcregrep -M --color "C\RCC|CC\RC" test.txt

解释:

(?<!C)   # Negative lookbehind: Don't match if there's a C before the match
(              # One of these:
      C\RCC    #   C + any kind of new line + CC
    | CC\RC    #  CC + any kind of new line + C
)
(?!C)    # Negative lookahead: Don't match it there's a C after the match

查看演示 here