鉴于this文件,我正在尝试替换页脚的超原始sed
或perl
。
通常我使用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
标记。
答案 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">
”开头的行时匹配,并且在以下行中它将不再匹配。