Sed 在 XML 匹配后替换整行
Sed replace entire line after match in XML
一旦我确定了正确的标签,我想替换 XML 中的一行。
拿
<root>
<My_Name>Andrew</My_Name>
<My_Age>94</My_Age>
</root>
我想更换
安德鲁
和
鲍勃
Bob 存储在 $nameVariable 中的位置
使用 sed,
sed -i 's/<My_Name>.*</My_Name>/<My_Name>$nameVariable</My_Name>/g'
这可能是由于缺少转义字符而失败,我曾尝试将其放在不同的位置,但似乎没有正确处理。
将不胜感激。
sed 不是编辑 XML 的好工具。无论您采用哪种方式,如果在错误的位置换行,或者如果有空标签,或者如果有嵌套标签,或者在无数其他情况下,它都会中断。
使用能够正确解析 XML 的工具。例如,对于 xmlstarlet:
xmlstarlet ed -u '/root/My_Name' -v "$nameVariable" filename.xml
这个awk
可能有效:
awk -v name="$nameVariable" '/<My_Name>/{sub(/>.*</,">"name"<")}1' file
<root>
<My_Name>Bob</My_Name>
<My_Age>94</My_Age>
</root>
修复您的 sed
。使用双引号并转义 /
sed -i "s/<My_Name>.*<\/My_Name>/<My_Name>$nameVariable<\/My_Name>/g" file
<root>
<My_Name>Bob</My_Name>
<My_Age>94</My_Age>
</root>
您可以对其进行一些更改,这样您就不需要两次输入文本了:
sed -i -r "s|(<My_Name>).*(</My_Name>)|$nameVariable|g" file
-r
所以我不需要转义 ()
.
将 /
替换为 |
,因此不需要转义 /
。
不要使用正则表达式来处理 XML。使用适当的 XML 处理工具。例如,我使用 xsh:
脚本:
open file.xml ;
set /root/My_Name { $ARGV[0] } ;
save :b ;
调用:
xsh script.xsh "$nameVariable"
一旦我确定了正确的标签,我想替换 XML 中的一行。
拿
<root>
<My_Name>Andrew</My_Name>
<My_Age>94</My_Age>
</root>
我想更换 安德鲁 和 鲍勃
Bob 存储在 $nameVariable 中的位置
使用 sed,
sed -i 's/<My_Name>.*</My_Name>/<My_Name>$nameVariable</My_Name>/g'
这可能是由于缺少转义字符而失败,我曾尝试将其放在不同的位置,但似乎没有正确处理。 将不胜感激。
sed 不是编辑 XML 的好工具。无论您采用哪种方式,如果在错误的位置换行,或者如果有空标签,或者如果有嵌套标签,或者在无数其他情况下,它都会中断。
使用能够正确解析 XML 的工具。例如,对于 xmlstarlet:
xmlstarlet ed -u '/root/My_Name' -v "$nameVariable" filename.xml
这个awk
可能有效:
awk -v name="$nameVariable" '/<My_Name>/{sub(/>.*</,">"name"<")}1' file
<root>
<My_Name>Bob</My_Name>
<My_Age>94</My_Age>
</root>
修复您的 sed
。使用双引号并转义 /
sed -i "s/<My_Name>.*<\/My_Name>/<My_Name>$nameVariable<\/My_Name>/g" file
<root>
<My_Name>Bob</My_Name>
<My_Age>94</My_Age>
</root>
您可以对其进行一些更改,这样您就不需要两次输入文本了:
sed -i -r "s|(<My_Name>).*(</My_Name>)|$nameVariable|g" file
-r
所以我不需要转义 ()
.
将 /
替换为 |
,因此不需要转义 /
。
不要使用正则表达式来处理 XML。使用适当的 XML 处理工具。例如,我使用 xsh:
脚本:
open file.xml ;
set /root/My_Name { $ARGV[0] } ;
save :b ;
调用:
xsh script.xsh "$nameVariable"