替换HTML文件中的多行,这些行由开始和结束模式标记。

时间:2013-06-18 10:44:48

标签: regex perl build-automation

我正在尝试进行自动构建,并在其中使用Perl来更新文件中的某些路径。

具体来说,在html文件中,我想采用下面显示的块

<!-- BEGIN: -->
<script src="js/a.js"></script>
<script src="js/b.js"></script>
<script src="js/c.js"></script>
<!-- END: -->

并将其替换为

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


我尝试过几个正则表达式:

perl -i -pe  's/<--BEGIN:(.|\n|\r)*:END-->/stuff/g' file.html

或刚刚开始:

perl -i -pe  's/BEGIN:(.|\n|\r)*/stuff/g' file.html

但我似乎无法超越第一线。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

perl -i -pe 's/<--BEGIN:(.|\n|\r)*:END-->/stuff/g' file.html

这太接近了。

  • 现在只需与/s修饰符匹配,即可.匹配任何字符,包括换行符。
  • 最重要的是,您希望与<!--开始匹配,请注意!
  • 另外,如果您有多个.*?标记,则需要END之类的非贪婪匹配。
  • 您的示例输入显示可能有额外的空格。

这将导致以下替换:

s/<!--\s*BEGIN:.*?END:\s*-->/stuff/sg

正如@plusplus指出的那样,-p遍历每一行。让我们将Perl的“线”概念改为“立即整个文件”:

BEGIN { $/ = undef }

或使用-0命令行开关,不带数字参数。