我需要使用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/>
答案 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