我在 xml 文件中有一个这样的字符串:
<h3>Styled here with: <a href="$url('Product-Show','pid','107723102')$">FRS blo</a>, <a href="$url('Product-Show','pid','000482512')$">Os Cutes</a>&nbsp;and <a href="$url('Product-Show','pid','000312901')$">Dor Sho</a></p></short-description>
我需要更换 /p>
部分与/h3>
.
我尝试在下面的帮助下做到这一点sed
:
sed -i -e 's/<h3>Styled here with\:.*\/p>/<h3>Styled here with\:.*\/h3>/g' new_exp_dev02.xml
但这根本不起作用,结果只是增加了一倍。
也许我忘记转义更多符号以便正确替换/p>
部分/h3>
?
答案1
sed
几乎可以使用任何字符作为其表达式的分隔符,我发现最好不要使用试图替换的字符串中的分隔符以限制转义错误。
sed -e 's!/p>!/h3\>!g' new_exp_dev02.xml
将替换/p>
为/h3>
.&
替换中的与号 ( ) 需要转义,因为该字符在sed
替换表达式中具有特殊含义。
你发布的sed
表达很难阅读,我不确定你想用它实现什么,但它似乎有一个不同的目标,然后“用 替换/p>
部分/h3>
”。
编辑:如果您必须以这种长形式编写表达式,这应该有效:
sed -e 's!\(<h3>Styled here with:.*\)/p>!\1/h3\>!g' new_exp_dev02.xml
这将整个匹配的部分放在一边作为/p>
后向引用,我们可以在替换部分中将其用作\1
。您不能在替换的替换端使用正则表达式sed
,因为正则表达式仅用于匹配。
此答案中的第一个表达式将替换所有出现的/p>
with /h3>
,第二个表达式仅/p>
在匹配正则表达式后立即出现时才会替换"<h3>Styled here with:.*"
答案2
您可以尝试使用下面的 perl 命令
perl -pne "s/p>/h3>/g" filename
输出
<h3>Styled here with: <a href="$url('Product-Show','pid','107723102')$">FRS blo</a>, <a href="$url('Product-Show','pid','000482512')$">Os Cutes</a>&nbsp;and <a href="$url('Product-Show','pid','000312901')$">Dor Sho</a></h3></short-description>