【发布时间】:2017-04-30 03:26:18
【问题描述】:
我要更改用户名的文件示例:
<host><![CDATA[localhost]]></host>
<username><![CDATA[root]]></username>
Here is my regex test 以确保匹配。
最后是 sed 命令,它没有错误地完成并且没有改变任何东西:
sed -i -e 's/(<username><!\[CDATA\[).*(\]\]><\/username>)/TEST/g' path/to/file.xml
这应该是结果:
<host><![CDATA[localhost]]></host>
TEST
除了根本不替换之外,我还需要它像这样工作,以便在前后保留捕获组,有效地只替换用户名:
sed -i -e 's/(<username><!\[CDATA\[).*(\]\]><\/username>)/\1TEST\2/g' path/to/file.xml
但这会返回此错误:
sed: -e expression #1, char 57: invalid reference \2 on `s' command's RHS
所以我认为捕获组以某种方式松散地匹配,因为它并没有真正捕获它们,这使得替换首先不会替换任何东西?
我想要的最终结果是这样的:
<host><![CDATA[localhost]]></host>
<username><![CDATA[TEST]]></username>
【问题讨论】:
-
为什么要使用正则表达式来解析 XML?无论如何,您没有任何捕获组 - 您需要使用
\(..\)或(在 GNU sed 中)添加-r选项以使用扩展正则表达式语法。 -
不一定解析 XML,只是替换两个模式之间的文本。你评论中的建议是我让它工作的方式,所以谢谢你。我根本不知道扩展的正则表达式。这就是我的 SED 现在在我的循环中的样子:
sed -i -r -e 's/(<'"$key"'><!\[CDATA\[).*(\]\]><\/'"$key"'>)/\1'"${db_local[$key]}"'\2/g' ${path_local[site]}/path/to/file.xml