perl提取2个分隔符之间的子串

时间:2015-11-10 02:30:48

标签: regex string perl string-split delimited-text

我有一个类似下面的文件。

Jobs                             |Status |Wait Reason |Wait Local |Wait Remote |Running |Passing |Failing |Skipped |Failures 
--------------------------------- ------- ------------ ----------- ------------ -------- -------- -------- -------- ---------
build1                           |FAILED |            |           |            |        |      8 |     5  |        |         
build2                `          |PASSED |            |           |            |        |      2 |        |        |         
build3                           |PASSED |            |           |            |        |      6 |        |        |        

我需要在分隔符'|'之间提取子字符串。我尝试使用以下正则表达式

$row=~ s/ //g; (@substrings)= $row =~ /|(.*?)\|/g;

结果是

0 :
1 : build1
2 :
3 : FAILED
4 :
5 :
6 :
7 :
8 :
..

我还使用了分割函数split '|',$row;,但它将数据作为

返回
b
u
i
l
d
1


|
F
..

我正在尝试提取以下数据。

$substrings[0]=build1
$substrings[1]=FAILED
$substrings[2]=(null) 

等等。

如何提取子串?

2 个答案:

答案 0 :(得分:2)

正如Maddy和sebnukem所说,分裂是答案。使用正则表达式是可行的,但由于在行的开头和结尾缺少管道(|),因此更复杂。这是一个读取数据文件的脚本:

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

foreach my $line (<>) {
#   print $line;
    chomp($line);
    next unless $line =~ /\|/; # only try lines with pipes in them
    my @fields = split(/\s+\|/,$line);
    print Dumper(\@fields);
}

以下是运行它的示例:

chicks$ cat data.txt | ./proc_data.pl 
$VAR1 = [
          'Jobs',
          'Status',
          'Wait Reason',
          'Wait Local',
          'Wait Remote',
          'Running',
          'Passing',
          'Failing',
          'Skipped',
          'Failures '
        ];
$VAR1 = [
          'build1',
          'FAILED',
          '',
          '',
          '',
          '',
          '      8',
          '     5',
          '',
          '         '
        ];
$VAR1 = [
          'build2                `',
          'PASSED',
          '',
          '',
          '',
          '',
          '      2',
          '',
          '',
          '         '
        ];
$VAR1 = [
          'build3',
          'PASSED',
          '',
          '',
          '',
          '',
          '      6',
          '',
          '',
          '        '
        ];

请注意,split将正则表达式放在斜杠中,而不是引号,并且必须对反斜杠进行转义:\|。我还包括一个\s+来修剪结果右侧的空格。正则表达式另一侧的\s+将获得左侧空格,如' 6'。如果您希望它匹配0个或更多空格,则应在这些位置使用*而不是+

答案 1 :(得分:0)

考虑使用拆分功能。以下是定界符为空格的示例,您可以将其替换为“|”管道符号。

my $str = "ab cd ef gh ij";
my @words = split / /, $str;