当前位置: 首页 > 知识库问答 >
问题:

Pcregrep复制匹配多行模式?

贺靖
2023-03-14

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

测试.txt:

AGAGUGGCAAUAUGCGUAUAACGAUUAUUCUGGUCGCACCCGCCAGAGCAGAAAAUAUUGGGGCAGCGCC
CAUGCUGGGUCGCACAUGGAUCUGGUGAUAUUAUUGAUAAUAUUAAAGUUUUCCCGACAUUGGCUGAAUA

使用命令:

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

返回:

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

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

它似乎正确地突出了第1行中的2个C,然而,它突出了第2行中的第一个C,然后继续完全打印出第二行;给我一个C的复制品。

我在这里做错了什么,我怎样才能避免第二行中重复的C?

共有1个答案

穆文斌
2023-03-14

试试这个:

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

我假设您只想找到3个<code>C</code>s,而且不可能找到更多,而且可能找到3个以上的<code>C</code>。如果这是不可能的,或者你不关心匹配超过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

在此处查看演示。

 类似资料:
  • TL;dr:我如何用pcregrep来拆分每一个多行匹配? 长版本:我有一些文件,有些行以(小写)字符开头,有些以数字或特殊字符开头。如果我至少有两行彼此相邻,以小写字母开头,我希望在我的输出中这样做。但是,我希望每个发现都被分隔/拆分,而不是相互附加。这是正则表达式: 所以,如果我提供这样的文件: 给出的结果是 然而,我想要的是这个: 这可能吗和/或我必须开始使用Python(或类似)?即使建议

  • 问题 你正在试着使用正则表达式去匹配一大块的文本,而你需要跨越多行去匹配。 解决方案 这个问题很典型的出现在当你用点(.)去匹配任意字符的时候,忘记了点(.)不能匹配换行符的事实。 比如,假设你想试着去匹配C语言分割的注释: >>> comment = re.compile(r'/\*(.*?)\*/') >>> text1 = '/* this is a comment */' >>> text

  • 我正在使用“pcregrep”在UNIX中实现多行搜索。我希望匹配在第一次出现时停止。 例如,如果我在文件中有以下文本: 我想打印,直到'ain'在'name'之后第一次出现。所以我只需要打印: 我正在执行: 但是,我得到的输出为:

  • 我编写了一个脚本,可以递归地从一个目录复制到另一个目录,跳过文件名中具有特定模式的文件: 在大多数情况下,它工作得很好。但我的问题是,它在每个文件夹中创建了一个子文件夹,其中包含文件。例如: 如果输入源作为具有此结构的目录: 我希望在目标文件夹中创建以下结构: 但相反,我得到了: 知道我哪里错了吗?

  • 问题内容: 我有一些复杂的日志文件,需要编写一些工具来处理它们。我一直在玩awk,但不确定awk是否适合此工具。 我的日志文件是OSPF协议解码的打印输出,其中包含各种协议pkts及其内容的文本日志,以及用值标识的各种协议字段。我想处理这些文件并仅打印出与特定pkts有关的日志的某些行。每个pkt日志可以包含该pkt条目的不同行数。 awk似乎能够处理与模式匹配的一行。我可以找到所需的pkt,但是