Perl替换失败,多行

时间:2013-02-12 10:31:21

标签: perl batch-file line-breaks substitution

我有两个网页,一个页面是手工创建的,另一个是使用visual studio 2010(.aspx)发布的。我想修改这些文件的内容,用一个脚本标记替换一堆脚本标记。为了实现这一目标,我只需从批处理文件中运行一些Perl代码。这是Perl代码和替换之前和之后的H​​TML:

批量生产Perl:

perl -pi.backup -e "s/<!--\s*<pack>\s*-->.*?<!--\s*<\/pack>\s*-->/<script src=\"pack.js\"><\/script>/s" file.aspx

HTML输入:

<!-- <pack> -->
<script src="file1.js" type="text/javascript"></script>
<script src="file2.js" type="text/javascript"></script>
<!-- </pack> -->

HTML输出:

<script src="pack.js"></script>

一切都适用于手工创建的文件,而生成的文件不会更新,除非所有行都被收集到一个文件中。我猜这个问题来自换行,但我无法弄清楚为什么它只适用于第一个文件,因为代码完全相同。

1 个答案:

答案 0 :(得分:0)

您的问题是,使用-p开关运行Perl会导致它执行每行的代码并打印结果。因此,正则表达式一次只能看到文件的一行,并且永远无法匹配整个模式。

你可以这样做:

perl -i.backup -e "undef $/; $_=<>; s/<!--\s*<pack>\s*-->.*?<!--\s*<\/pack>\s*-->/<script src=\"pack.js\"><\/script>/s; print" file.aspx

它将整个文件粘贴到$_,然后执行替换并将结果打印到同一文件。