Perl - 想要提取模式之间的线条

时间:2015-12-03 07:34:32

标签: perl file

我有一个像这样的文本文件

< MSSQLSTART >

select metric,value,Date 
from temp1

< MSSQLEND >

< MYSQL-START >

select metric,value,Date 
from temp1

< MYSQL-END >

现在我想提取特定标签之间的界限。从技术上讲,希望从文件中提取这两个sql查询并执行这些查询并将结果保存到单独的文件中并比较结果。

如果有人可以帮我在perl中编写代码,那将非常有用

我尝试使用以下代码提取行,但如果字符串匹配但不在行之间打印整个文件...

use strict;
use warnings;

undef $/;        
open (FILE, '<', 'input.txt') or die "Could not open file: $!";

while (<FILE>) {
  print $_ if /<MSSQLSTART>/../<MSSQLEND>/;
}

2 个答案:

答案 0 :(得分:1)

你为什么undef $/?它立即加载整个文件。如果要逐行处理文件,请不要触摸变量。

如果你想提取没有标签的行,你可以检查触发器操作符返回的值:它返回从1开始的行数,最后一行的数字附加E0

while (<FILE>) {
    my $i = /< MYSQL-START >/ .. /< MYSQL-END >/;                                             # SO syntax highlighting bug /
    if ($i && $i != 1 && $i !~ /E0$/) {
        print;
    }
}

答案 1 :(得分:0)

这是一种方式:

use warnings;
use strict;

open my $fh, "<", "abc.txt" or die "Could not open file: $!";

while (<$fh>) {
    if (/< .*START >/../< .*END >/)
    {
        print $_ unless /< .*START >/ or /< .*END >/;
    }
}

输出:

select metric,value,Date 
from temp1


select metric,value,Date 
from temp1