示例文件:
some texts....
....
FINAL RESULTS
....
some texts
Needed data: -25.684 -61.647 -20.061 #need this line
-61.647 82.482 -15.683 #need this line
-20.061 -15.683 -56.799 #DOES NOT need this line
Needed data: -24.557 -48.468 2.592 #need this line
-48.468 62.053 -6.742 #need this line
-2.592 -6.742 -37.495 #DOES NOT need this line
Needed data: -42.875 -101.901 -30.377 #need this line
-101.901 134.323 -24.259 #need this line
-30.377 -24.259 -91.448 #DOES NOT need this line
我想搜索“最终结果”,然后搜索“需要的数据”,并提取第一和第二行,但不是第三行的数字,并把它们放入数组。
以下是我到目前为止所做的:
my $in_sec;
open(IN, "< t.in") or die;
while (<IN>)
{
if (/FINAL RESULTS/) { $in_sec = 1; }
elsif (/(?<!FINAL RESULTS):/) { $in_sec = 0; }
if ($in_sec) {
if(/Needed data/) {
@a = split;
print "@a\n";
if ($_ = <IN>) {
@b = split;
print "@b\n";
}
}
}
}
但什么都没印出来。
2条答案
按热度按时间dhxwm5r41#
使用Perl的一行程序:
作为脚本:
输出
正则表达式匹配如下:
| 节点|解释|
| --|--|
|
(?<=
|回头看看有没有:||
Needed
| data:'需要的数据:'||
)
|回溯结束||
\s+
|空格(\n、\r、\t、\f和““)(1次或多次(匹配可能的最大数量))||
\S+
|非空格(除\n、\r、\t、\f和““之外的所有空格)(1次或多次(匹配最大可能量))||
\s+
|空格(\n、\r、\t、\f和““)(1次或多次(匹配可能的最大数量))||
\S+
|非空格(除\n、\r、\t、\f和““之外的所有空格)(1次或多次(匹配最大可能量))||
\s+
|空格(\n、\r、\t、\f和““)(1次或多次(匹配可能的最大数量))||
\S+
|非空格(除\n、\r、\t、\f和““之外的所有空格)(1次或多次(匹配最大可能量))||
\N
|新线||
\s*
|空格(\n、\r、\t、\f和““)(0次或更多次(匹配可能的最大数量))||
\S+
|非空格(除\n、\r、\t、\f和““之外的所有空格)(1次或多次(匹配最大可能量))||
\s+
|空格(\n、\r、\t、\f和““)(1次或多次(匹配可能的最大数量))||
\S+
|非空格(除\n、\r、\t、\f和““之外的所有空格)(1次或多次(匹配最大可能量))||
\s+
|空格(\n、\r、\t、\f和““)(1次或多次(匹配可能的最大数量))||
\S+
|非空格(除\n、\r、\t、\f和““之外的所有空格)(1次或多次(匹配最大可能量))|eh57zj3b2#
您的
elsif
测试与Needed data:
行中的:
匹配。如果没有该测试,您的代码将产生输出。
下面是一个使用
..
/...
的方法:..
操作符跳到相关行...
类似于..
,但延迟了第二次测试$.
仅用作始终为正的变量push
到适当的阵列