sed替换多个xml标记

时间:2013-09-27 04:04:31

标签: regex unix sed

我需要使用sed替换xml文件中的多行。这是我的输入文件:

<firstTag>Y</firstTag>
<secondTag/>

我想将这些行替换为以下格式:

<firstTag></firstTag>
<secondTag>Y</secondTag>

我尝试使用此命令:

sed -i -r "s#<firstTag>Y</firstTag>\n.*#<firstTag></firstTag>\n<secondTag>Y</secondTag>#g" input.txt

但它不起作用。我还注意到在secondTag之前有一些标签(^我使用较少的命令)。它会影响sed命令吗?请帮帮我。

更新:文件中有多次出现secondTag,我只想在找到firstTag的前一个值为Y后才将secondTag值更改为Y.例如,如果在input.txt中:

<firstTag>Y</firstTag>
<secondTag/>
<firstTag/>
<secondTag/>

我希望将其替换为:

<firstTag></firstTag>
<secondTag>Y</secondTag>
<firstTag/>
<secondTag/>

4 个答案:

答案 0 :(得分:2)

这可能适合你(GNU sed):

sed -r '$!N;s|^(<firstTag>)Y(</firstTag>\n<(secondTag))/>$|\1\2>Y</\3>|;P;D' file

答案 1 :(得分:1)

使用awk即可:

awk -F"[<>/]" '/^<firstTag>/ {f=$3;$0="<"$2"></"$2">"} /^<secondTag\/>/ {$0="<"$2">" f "</"$2">"}1' file
<firstTag><firstTag/>
<secondTag>Y</secondTag>

关于这个评论:

  抱歉,我忘了提到有多次出现   secondTag和我只想将secondTag值更改为Y.   之后发现firstTag的前一个值是Y

这是另一个awk,如果有secondTag,则仅更改第一个firstTag,忽略所有其他内容:

cat file
<secondTag/>
<firstTag>Y</firstTag>
<secondTag/>
<someOtherTag>
<secondTag/>

awk

awk -F"[<>/]" '/^<firstTag>/ {f=$3;$0="<"$2"></"$2">"} f && /^<secondTag\/>/ {$0="<"$2">" f "</"$2">";f=""}1' file
<secondTag/>
<firstTag></firstTag>
<secondTag>Y</secondTag>
<someOtherTag>
<secondTag/>

答案 2 :(得分:1)

您可以试试sed

sed -r '/<firstTag>.*<\/firstTag>/{N;s#(<firstTag>)(.*)((</firstTag>\n)<secondTag/>)#\1\4<secondTag>\2</secondTag>#g}' file.txt

答案 3 :(得分:0)

如何分离两个标签替换?

sed -i -r -e "s#<firstTag>Y</firstTag>#<firstTag></firstTag>#" -e "s#<secondTag/>#<secondTag>Y</secondTag>#" input.txt