perl 单行中的反向多行 grep

问题描述 投票:0回答:1

我有一个格式不一致的文本文件,但相关部分看起来像:

     CDS             complement(99074..99808)
                     /note="important in cell to cell spread of the virus, a
                     tegument protein"
                     /codon_start=1

作为现有 bash 管道的一部分,我需要删除 /note="anything" 的模式才能获得

     CDS             complement(99074..99808)
                     /codon_start=1

我已经尝试了几种方法来反转 grep,但最接近的方法只有在匹配不跨越多行时才有效:

perl -ne '/\/\bnote\b\="[^"]+"/||print' file.txt

我可以通过检查以下 perl 单行来匹配我希望删除的字符串,但到目前为止我无法结合这两种方法来反转匹配并删除跨越多行的字符串:

perl -0777 -ne 'print "$1\n" while ( /(\s+\/\bnote\b\="[^"]+")/sg )' file.txt

将第一个单行代码作为 -0777 会导致没有输出。

perl regex-negation one-liner
1个回答
0
投票

简单的方法是将整个流读入内存。这是通过使用

-0777
或新的
-g
告诉 Perl 将整个文件视为单行来完成的。

perl -0777pe's{^\s*/note="[^"]*"\n}{}mg'

一次做一行比较复杂,因为它需要一个标志来指示我们是否在字符串中。

perl -ne'
   $f ||= m{^\s*/note="};
   print if !$f;
   $f &&= !m{"$};
'
© www.soinside.com 2019 - 2024. All rights reserved.