如何使用perl替换两个特定行之间的文本

时间:2012-09-06 21:22:17

标签: html regex perl

您好我有一个名为1.html文件的html,就像这样

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

我想将该div的内容替换为另一个div,该内容存储在名为“banner”的文件中。 横幅文件是

<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 个答案:

答案 0 :(得分: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 :(得分:1)

使用

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

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