Perl One Liner解析正则表达式中的多个条件

时间:2010-03-02 05:59:10

标签: regex linux perl unix

我的文件包含如下所示的行:

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

并非每行都包含6个OR 5字段。我想要做的就是捕获 字段1,2,3(仅限num),5(仅限num)和最后一个字段(ACGT或MGOQ字符串)。

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

>AF001546_1 88 462 MGQQ
>AF001543_1 88 261 ACGT

现在我使用的perl单行是这个,但失败了:

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

这样做的正确方法是什么?

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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";
}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

你需要使用修饰符/ m

答案 4 :(得分:1)

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

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