2

首先对我糟糕的英语感到抱歉。我是德国人。

下面给出的代码在 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' 命令的 RHS 上的无效引用 \1

4

6 回答 6

3

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

于 2010-01-18T14:06:30.417 回答
2

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

sed 's/href="\(.*?\)(.|\,)"/href="{$\1}"/g' test.htm
于 2010-01-18T14:00:22.363 回答
2
sed -e 's|href=\"\(.[^"][^>]*\)\([.,]\)\">|href="\1">|g' file
于 2010-01-18T14:19:04.343 回答
0

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

sed 's/href="\(.*?\)\(.|\,\)"/href="{$\1}"/g' test.htm
于 2010-01-18T14:04:02.523 回答
0

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

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

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

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

于 2010-01-18T14:19:00.240 回答
0

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


sed -r -e 's/href="([^"]*)([.,]+)"/href="\1"/g' test.htm
于 2010-01-18T14:24:45.600 回答