【问题标题】:perl one-liner to keep only desired linesperl one-liner 只保留所需的行
【发布时间】:2016-10-27 01:18:46
【问题描述】:

我有一个像这样的文本文件 (input.txt):

NP_414685.4: 15-26, 131-138, 441-465
NP_418580.2: 493-500
NP_418780.2: 36-48, 44-66
NP_418345.2:
NP_418473.3: 1-19, 567-1093
NP_418398.2:

我想要一个 perl 单行,它只保留文件中“:”后跟数字范围的那些行(这意味着,在这里,包含“NP_418345.2:”和“NP_418398.2:”的行被删除)。为此我尝试过:

perl  -ni -e "print unless /: \d/" -pi.bak input.txt del input.txt.bak

但它显示的输出与输入文件完全相同。 我可以在这里匹配的确切模式是什么? 谢谢

【问题讨论】:

    标签: perl


    【解决方案1】:

    首先,print unless 的意思是 print if not——与你想要的相反。

    更重要的是,同时使用-n-p 是没有意义的,当你这样做时-p 会覆盖另一个。当他们都打开输入文件并设置循环时,-p 也会为 每个 迭代打印$_。因此,有了它,您就可以重印每一行。见perlrun

    最后,您似乎要删除.bak 文件...?那就别做了。只使用-i

    一共

    perl -i -ne 'print if /:\s*\d+\s*-\s*\d+/' input.txt
    

    如果您确实想保留备份文件,请使用 -i.bak 而不是 -i


    您可以使用B::Deparse(通过O 模块)查看相当于带有特定选项的单行代码

    试试:perl -MO=Deparse -ne 1perl -MO=Deparse -pe 1

    【讨论】:

      【解决方案2】:

      这边:

      perl -i.bak -ne 'print if /:\s+\d+-\d/' input.txt
      

      【讨论】:

        【解决方案3】:

        这个:

        perl -ne 'print if /:\s*(\d+\s*-\s*\d+\s*,?\s*)+\s*$/' input.txt
        

        打印:

        NP_414685.4: 15-26, 131-138, 441-465
        NP_418580.2: 493-500
        NP_418780.2: 36-48, 44-66
        NP_418473.3: 1-19, 567-1093
        

        我不确定您是否要匹配可能是这样的行:

        NP_418580.2: 493-500, asdf
        

        或者这个:

        NP_418580.2: asdf
        

        这个答案不会打印这些行,如果给它的话。

        【讨论】:

        • 这适用于示例数据。如果有非数字字符,它将无法按 OP 的预期工作
        猜你喜欢
        • 2012-08-01
        • 2014-07-31
        • 2016-11-22
        • 2014-05-08
        • 2014-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多