2015-12-03 20 views
1

之間提取線我有這樣Perl的 - 希望的模式

<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>/; 
} 

回答

1

爲什麼你undef $/?它一次加載整個文件。如果要逐行處理文件,請勿觸摸該變量。

如果要提取沒有標籤的線,你可以檢查值從觸發器符返回:返回從1開始的線數,最後一行的數量已經E0附加:

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

是什麼設置'$ i'做我在這種情況下?你能不能用範圍操作符來做? – Sobrique

+0

@Sobrique:我想不出一種方法來檢查範圍運算符是否與1不同,並且不會以'E0'結尾。 – choroba

+0

@Sobrique:'print if(/ /../< MYSQL-END > /)!〜/(?:^ 1?| E0)$ /;'起作用,但不可讀。 – choroba

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