我有一个格式不一致的文本文件,但相关部分如下所示:
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 不会产生任何输出。
最佳答案
简单的方法是将整个流读入内存。这是通过使用 -0777
或新的 -g
告诉 Perl 将整个文件视为一行来完成的。
perl -0777pe's{^\s*/note="[^"]*"\n}{}mg'
一次执行一行会更复杂,因为它需要一个标志来指示我们是否在字符串中。
perl -ne'
$f ||= m{^\s*/note="};
print if !$f;
$f &&= !m{"$};
'
关于perl - Perl 单行程序中的逆多行 grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75691520/