【问题标题】:PCRE regex to sed regexPCRE 正则表达式到 sed 正则表达式
【发布时间】:2010-01-18 13:57:09
【问题描述】:

首先对不起我的英语不好。我是德国人。

下面给出的代码在 PHP 中运行良好:

$string = preg_replace('/href="(.*?)(\.|\,)"/i','href="$1"',$string);

现在sed 需要相同的值。我认为应该是:

sed 's/href="(.*?)(\.|\,)"/href="{$\1}"/g' test.htm

但这给了我这个错误:

sed: -e 表达式 #1,字符 36: 's' 命令的无效引用 \1 右心轴

【问题讨论】:

  • 你想用这个正则表达式做什么?
  • 您能澄清一下您要匹配和替换的内容吗?我对 PHP 正则表达式的了解不如我对 Linux 的了解。
  • PHP 使用 Perl 兼容正则表达式 (PCRE)。
  • 我正在尝试替换带有 .或者,最后。所以 blubb.de,"> 应该替换为 blubb.de">

标签: regex sed pcre


【解决方案1】:

sed 不支持非贪婪的正则表达式匹配。

【讨论】:

  • 请详细说明此事。
  • (.*?)
  • 所以如果 sed 不支持非贪婪匹配,它应该支持贪婪匹配 - 我错过了什么?
  • @Adam:OP 依靠非贪婪匹配来使 RE 工作。 RE 很可能最终会消耗超出 href 属性末尾的字符。
【解决方案2】:
sed -e 's|href=\"\(.[^"][^>]*\)\([.,]\)\">|href="\1">|g' file

【讨论】:

    【解决方案3】:

    您需要在要引用的括号前加一个反斜杠,因此

    sed 's/href="\(.*?\)(.|\,)"/href="{$\1}"/g' test.htm
    

    【讨论】:

    • 你没有说你想做什么,只是正则表达式失败:)
    【解决方案4】:

    您必须转义块选择符 (),如下所示。

    sed 's/href="\(.*?\)\(.|\,\)"/href="{$\1}"/g' test.htm
    

    【讨论】:

      【解决方案5】:

      这里有一个解决方案,它不是完美的,只处理一个额外的“,”或“。”的情况

      
      sed -r -e 's/href="([^"]*)([.,]+)"/href="\1"/g' test.htm
      

      【讨论】:

        【解决方案6】:

        如果要匹配文字“.”,则需要对其进行转义或在字符类中使用它。作为削减捕获括号的替代方法(您需要对基本 RE 执行此操作),您可以使用 -E 选项告诉 sed 使用扩展 RE。最后,sed 使用的 RE 使用\N 来指代子模式,其中N 是一个数字。

        sed -E "s/href=([\"'])([^\"']*)[.,]\1/href=\1\2\1/i"
        

        这有其自身的问题,会阻止匹配使用两种引号类型的 href 属性。

        man sedman re_format 将提供有关 sed 中使用的 RE 的更多信息。

        【讨论】:

        • 在我的 sed 版本中,它使用 -r 指定扩展正则表达式(不需要转义括号)而不是 -E
        猜你喜欢
        • 2014-09-10
        • 2023-03-20
        • 1970-01-01
        • 2014-08-02
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多