我有两个网页,一个页面是手工创建的,另一个是使用visual studio 2010(.aspx)发布的。我想修改这些文件的内容,用一个脚本标记替换一堆脚本标记。为了实现这一目标,我只需从批处理文件中运行一些Perl代码。这是Perl代码和替换之前和之后的HTML:
批量生产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>
一切都适用于手工创建的文件,而生成的文件不会更新,除非所有行都被收集到一个文件中。我猜这个问题来自换行,但我无法弄清楚为什么它只适用于第一个文件,因为代码完全相同。
答案 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
它将整个文件粘贴到$_
,然后执行替换并将结果打印到同一文件。