【问题标题】:Perl Oneliner to parse multiple conditions in regexPerl One Liner 解析正则表达式中的多个条件
【发布时间】:2011-01-22 14:27:26
【问题描述】:

我有一个文件,其中包含如下所示的行:

>AF001546_1 [88 - 462] 1 MGQQ
>AF001543_1 [88 - 261] ACGT

并不是每行可以包含 6 或 5 个字段。我想做的是捕捉 字段 1、2、3(仅 num)、5(仅 num)和最后一个字段(ACGT 或 MGOQ 字符串)。

所以预期的输出是这样的:

>AF001546_1 88 462 MGQQ
>AF001543_1 88 261 ACGT

现在我用的perl one-liner是这个,但是失败了:

perl -lne 'print "$1 $2 $3 $4" if /(\w+)_\d+\D+(\d+)\D+(\d+)\](\D+)/' 

正确的做法是什么?

【问题讨论】:

    标签: regex linux perl unix


    【解决方案1】:
    perl -lne 'print "$1 $2 $3 $4" if /(>\w+)\D+(\d+)\D+(\d+)\D+\d*\s+(\w+)/'
    

    【讨论】:

      【解决方案2】:

      你也使用下面的代码

      use strict;
      use warnings;
      
      my $str=">AF001546_1 [88 - 462] 1 MGQQ";
      
      if($str=~/(\w+)\s\D([0-9]{2}) - ([0-9]{3})\D\s\d\s(.*)/)
      {
           print "$1 $2 $3 $4\n";
      }
      

      【讨论】:

        【解决方案3】:
        while(<>){
         chomp;
         s/\[|\]//g;
         if ($_ =~ /^>/){
            @s = split /\s+/;
            print "$s[0] $s[1] $s[3]\n";
         }    
        }
        
        $ perl -F"\s+" -lane '$F[3]=~s/\]//;$F[1]=~s/\[//;print "$F[0] $F[1] $F[3]";' file
        >AF001546_1 88 462
        >AF001543_1 88 261
        

        【讨论】:

          【解决方案4】:

          试试这个 perl -lne 'print "$1 $2 $3 $4" if /(\w+)_\d+\D+(\d+)\D+(\d+)](\D+)/m'

          你需要使用修饰符/m

          【讨论】:

          • 没有。 /m 修饰符仅更改 ^ 和 $ ,它们甚至不在您的正则表达式中。此外,-n 开关意味着它一次处理一行。
          • 是的,我同意。我要坚持/m
          【解决方案5】:

          根据空白的灵活程度,这是相当可读的:

          print "$1 $2 $3 $4" if /([^_]+)_\d+ \[(\d+) - (\d+)\] (?:\d+ )?(.*)/
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多