2

我需要使用 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 之前有一些选项卡(^I using less command)。它会影响 sed 命令吗?请帮我解决这个问题。

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

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

我希望将其替换为:

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

4 回答 4

2

这可能对您有用(GNU sed):

sed -r '$!N;s|^(<firstTag>)Y(</firstTag>\n<(secondTag))/>$|\1\2>Y</\3>|;P;D' file
于 2013-09-27T06:43:17.550 回答
1

使用awk你可以这样做:

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

关于这条评论:

对不起,我忘了提到 secondTag 多次出现,我只想在发现 firstTag 的先前值为 Y 后才将 secondTag 值更改为 Y

这是另一个awk仅在secondTag有 a 时更改第一个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/>
于 2013-09-27T05:44:31.200 回答
1

你可以试试这个sed

sed -r '/<firstTag>.*<\/firstTag>/{N;s#(<firstTag>)(.*)((</firstTag>\n)<secondTag/>)#\1\4<secondTag>\2</secondTag>#g}' file.txt
于 2013-09-27T05:45:53.017 回答
0

将两个标签替换分开怎么样?

sed -i -r -e "s#<firstTag>Y</firstTag>#<firstTag></firstTag>#" -e "s#<secondTag/>#<secondTag>Y</secondTag>#" input.txt
于 2013-09-27T04:26:00.787 回答