首先抱歉我的英语不好。我是德国人。
下面给出的代码在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
答案 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 sed
和man re_format
将提供有关sed中使用的RE的更多信息。
答案 5 :(得分:0)
这是一个解决方案,它并不完美,只处理一个额外“,”或“。”的情况。
sed -r -e 's/href="([^"]*)([.,]+)"/href="\1"/g' test.htm