perl - Perl 单行程序中的逆多行 grep

标签 perl regex-negation one-liner

我有一个格式不一致的文本文件,但相关部分如下所示:

     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/

相关文章:

perl - 打开时指定编码时无法写入

Perl:Math64::Int64 应该在 "Safe"隔间内工作吗?

perl - 请向我解释 map 在这种情况下是如何工作的

regex - 重写正则表达式而不使用否定

python for if one liner

arrays - 使用 Perl 使用 RegEx 或符号后面出现的值对数组进行排序

c# - 使用负向后查找来匹配字符串中的单词

在文件中替换的正则表达式

c++ - 一个变量的一行 extern "C"- 合法吗?

python - 如何减少 lambda 表达式中辅助函数的使用?