【问题标题】:Regex in perl/sed replacement not matching whitespace/charactersperl/sed 替换中的正则表达式不匹配空格/字符
【发布时间】:2012-05-16 03:11:39
【问题描述】:

鉴于this 文件,我正在尝试对页脚进行超级原始sedperl 替换。

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

我只需要用<?php include 'footer.php';?> 替换包含空格的<div id="footer">、包含另一个元素的元素和结束</div>

由于某种原因,在<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 标志。

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    你可能想要-0777,它会强制 perl 一次读取整个文件。

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

    另外,您的.*\s*.*\s* 策略非常脆弱。它会匹配例如&lt;div id="foo",这只是一个片段……

    【讨论】:

    • perl -0777 -i -pe 's|&lt;div id="footer"&gt;.*\s*.*\s*|&lt;?php include INC_PATH . 'includes/footer.php'; ?&gt;|g' file.html 工作。谢谢!是时候将我的正则表达式调整得更具体了,它是用于测试目的的原始表达式。
    【解决方案2】:

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

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

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

    【讨论】:

    • 难道没有像m 这样可以进行多行匹配的标志吗?我经常使用 rubular.com,我想它默认有这个。问题可能是 perl 的正则表达式引擎与 JS/ruby 引擎不同。
    • 是的,你赢了那个;在您发布建议后,我稍微发现了它。我学到了一些有用的东西:)
    • m 选项是multiline 修饰符,它使^$ 锚在一行的开头和结尾匹配。您的意思是 s singleline 修饰符(单行,因为它将整个字符串视为一行),它使 . 匹配换行符。但这不是这里的问题,因为 \s 在这里是为了匹配换行符,如果它会看到换行符,那会起作用。
    【解决方案3】:
    perl -p
    

    正在逐行处理文件see perl.com

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

    【讨论】:

    • 该链接似乎很有用。虽然有点过时了。 (即 -E 未提及,因为它在 2004 年不存在)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    相关资源
    最近更新 更多