perl / sed替换中的正则表达式不匹配空格/字符

时间:2012-05-15 18:55:28

标签: regex perl

鉴于this文件,我正在尝试替换页脚的超原始sedperl

通常我使用DOM来解析HTML文件,但到目前为止,由于我使用sed / perl处理的原始HTML文件(时间很重要),我没有遇到任何问题。

我只需要替换包含空格的<div id="footer">,包含其他元素的元素,以及使用</div>的结束<?php include 'footer.php';?>

出于某种原因,我甚至不能在<div id="stupid">之前得到这种模式。我知道有空白字符所以我使用了\s*

perl -pe 's|<div id="footer">.*\s*.*\s*|<?php include INC_PATH . 'includes/footer.php'; ?>|' file.html | less

但这只匹配第一行。替换看起来像这样:

<?php include INC_PATH . includes/footer.php; ?> 
                   <div id="stupid"><img src="file.gif" width="206" height="252"></div>

               </div>

我忘记了一些简单的事情,还是应该指定某种标志来处理多线匹配?

perl -v是5.14.2,我只使用pe标记。

3 个答案:

答案 0 :(得分:1)

您可能需要-0777,这会强制perl立即读取整个文件。

perl -0777 -n -e 's|something|else|g' file

此外,您执行.*\s*.*\s*的策略非常脆弱。它会匹配,例如<div id="foo",这只是一个片段......

答案 1 :(得分:0)

您是否忘记了几乎所有的正则表达式解析都是逐行进行的?

我总是不得不使用tr将换行符转换为其他字符,然后在正则表达式后再返回。

刚发现:http://www.perlmonks.org/?node_id=17947 你需要告诉正则表达式引擎将你的标量视为带有/ m选项的多行字符串;否则它不会尝试匹配换行符。

答案 2 :(得分:0)

perl -p

正逐行see perl.com

处理该文件

这意味着你的正则表达式永远不会看到所有匹配的行,它只会在得到以“<div id="footer">”开头的行时匹配,并且在以下行中它将不再匹配。