PCRE正则表达到sed正则表达式

时间:2010-01-18 13:57:09

标签: regex sed pcre

首先抱歉我的英语不好。我是德国人。

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

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

现在T需要sed。我认为应该是:

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

但是这给了我这个错误:

  

sed:-e表达式#1,char 36:   's'命令的无效引用\ 1   RHS

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

sed -e 's|href=\"\(.[^"][^>]*\)\([.,]\)\">|href="\1">|g' file

答案 3 :(得分:0)

您必须按如下方式转义块选择器字符()

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

答案 4 :(得分:0)

如果要匹配文字“。”,则需要将其转义或在字符类中使用它。作为削减捕获括号(您需要使用基本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的更多信息。

答案 5 :(得分:0)

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


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