2012-09-06 44 views
2
之間的替換文本

您好我有一個名爲HTML文件1.HTML這樣如何使用Perl兩條特定線

<div class="t_l"></div> 
<some> 
    lines 
    of 
codes 
</some> 
<div class="t_r"></div> 

我要替換的div到另一個,它存儲在內容文件稱爲「橫幅」。 橫幅文件是

<other> 
    lines 
    of some 
codes 
</other> 

所以,我想的是:

<div class="t_l"></div> 
<other> 
    lines 
    of some 
codes 
</other> 
<div class="t_r"></div> 

我想出用perl是這樣的:

# Slurp file 1.html into a single string 
open(FILE,"1.html") or die "Can't open file: $!"; 
undef $/; 
my $file = <FILE>; 
open(BANNER,"banner") or die "Can't open file: $!"; 
undef $/; 
my $banner = <BANNER>; 
close BANNER; 

# Set strings to find and insert 
my $first_line = '<div class="t_l"></div>'; 
my $second_line = '<div class="t_r"></div>'; 

$file =~ s/$first_line\n.+?\n$second_line#s/$first_line\n$banner\n$second_line/; 

close FILE; 

# Write output to output.txt 
open(OUTPUT,">1new.html") or die "Can't open file: $!"; 
print OUTPUT $file; 
close OUTPUT; 

上面的代碼不能工作。有什麼建議麼?

+2

你應該使用其中之一perl HTML解析器模塊,例如'HTML :: TokeParser'。 – David

+0

你真的不想用正則表達式解析HTML。那就是瘋狂: - / –

回答

2

你快到了。

.的正常正則表達式行爲是匹配除換行符以外的任何字符。您的正則表達式中的.+?不適用於您,因爲$first_line$second_line之間有更多換行符。

使用/s修飾符告訴Perl讓.也與換行符匹配。

(你也可以在你的表達外來 「#s」)

所以工作替換爲:

$file =~ s/$first_line\n.+?\n$second_line/$first_line\n$banner\n$second_line/s; 
1

圍棋與

$file =~ s/($first_line\n)[^\n]+(\n$second_line)/$1$banner$2/; 

$file =~ s/(?<=$first_line\n)[^\n]+(?=\n$second_line)/$banner/; 
相關問題