2013-02-12 93 views
0

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

的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

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

你可以做这样的事情:

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

它吸食整个文件到$_,然后执行您的替换并打印结果到同一个文件。

+0

谢谢,它的工作原理!你能解释为什么我的版本适用于两个文件之一? – leaf 2013-02-12 10:50:44

+1

@wared,你手工创建的文件可能会存储换行符,这是Perl不能识别的格式。 – 2013-02-12 10:54:52

+0

好的,非常感谢! – leaf 2013-02-12 11:13:40