1

鉴于这个文件,我正在尝试做一个超级原始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标志。

4

3 回答 3

1

您可能想要-0777,这将强制 perl 一次读取整个文件。

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

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

于 2012-05-15T19:11:39.080 回答
0

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

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

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

于 2012-05-15T19:00:12.857 回答
0
perl -p

正在逐行处理文件,请参阅 perl.com

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

于 2012-05-15T19:08:38.837 回答