我有一个类似下面的文件。
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)
等等。
如何提取子串?
答案 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;