使用bash替换xml文件中的html字符实体

使用bash替换xml文件中的html字符实体

我在 xml 文件中有一个这样的字符串:

&lt;h3&gt;Styled here with: &lt;a href="$url('Product-Show','pid','107723102')$"&gt;FRS blo&lt;/a&gt;, &lt;a href="$url('Product-Show','pid','000482512')$"&gt;Os Cutes&lt;/a&gt;&amp;nbsp;and &lt;a href="$url('Product-Show','pid','000312901')$"&gt;Dor Sho&lt;/a&gt;&lt;/p&gt;</short-description>

我需要更换 /p&gt部分与/h3&gt.

我尝试在下面的帮助下做到这一点sed

sed -i -e 's/&lt;h3&gt;Styled here with\:.*\/p&gt;/&lt;h3&gt;Styled here with\:.*\/h3&gt;/g' new_exp_dev02.xml

但这根本不起作用,结果只是增加了一倍。

也许我忘记转义更多符号以便正确替换/p&gt部分/h3&gt

答案1

sed几乎可以使用任何字符作为其表达式的分隔符,我发现最好不要使用试图替换的字符串中的分隔符以限制转义错误。

sed -e 's!/p&gt!/h3\&gt!g' new_exp_dev02.xml将替换/p&gt/h3&gt.&替换中的与号 ( ) 需要转义,因为该字符在sed替换表达式中具有特殊含义。

你发布的sed表达很难阅读,我不确定你想用它实现什么,但它似乎有一个不同的目标,然后“用 替换/p&gt部分/h3&gt”。

编辑:如果您必须以这种长形式编写表达式,这应该有效:

sed -e 's!\(&lt;h3&gt;Styled here with:.*\)/p&gt;!\1/h3\&gt;!g' new_exp_dev02.xml

这将整个匹配的部分放在一边作为/p&gt后向引用,我们可以在替换部分中将其用作\1。您不能在替换的替换端使用正则表达式sed,因为正则表达式仅用于匹配。

此答案中的第一个表达式将替换所有出现的/p&gtwith /h3&gt,第二个表达式仅/p&gt在匹配正则表达式后立即出现时才会替换"&lt;h3&gt;Styled here with:.*"

答案2

您可以尝试使用下面的 perl 命令

 perl -pne "s/p&gt/h3&gt/g" filename

输出

&lt;h3&gt;Styled here with: &lt;a href="$url('Product-Show','pid','107723102')$"&gt;FRS blo&lt;/a&gt;, &lt;a href="$url('Product-Show','pid','000482512')$"&gt;Os Cutes&lt;/a&gt;&amp;nbsp;and &lt;a href="$url('Product-Show','pid','000312901')$"&gt;Dor Sho&lt;/a&gt;&lt;/h3&gt;</short-description>

相关内容