![使用命令行修改 XML 文件的多行](https://linux22.com/image/94361/%E4%BD%BF%E7%94%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%BF%AE%E6%94%B9%20XML%20%E6%96%87%E4%BB%B6%E7%9A%84%E5%A4%9A%E8%A1%8C.png)
看看下面的文本,如何替换多行文本?
<Model500>
ABC
BCD
CDE
</Model500>
<Model500>
123
234
345
</Model500>
输出可能如下所示
<Model500>
AAA
BBB
CCC
</Model500>
<Model500>
111
333
555
</Model500>
我想用sed
任何与 Bash 一起使用的命令行实用程序来完成此操作。我应该使用循环来完成此任务吗?
答案1
使用适当的XML工具,在外壳中,xmlstarlet是一个很好的:
xmlstarlet edit -L -u "//Model500[1]" -v "AAA
BBB
CCC" file.xml
xmlstarlet edit -L -u "//Model500[2]" -v "111
333
555" file.xml
cat file.xml
表达式//Model500[2]
是一个X路径表达式
注意 1
你需要用如下标签将你的 xml 括起来:
<root>
...
</root>
XML 有效。我希望您为了解决问题而剪切了 XML 文件。
注²
您还可以使用Python,珀尔,红宝石等等...以及一个适当的 xml 库。
在珀尔:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Simple;
my $xml_file = 'file.xml';
my $xml = XMLin(
$xml_file,
KeepRoot => 1,
ForceArray => 1,
);
$xml->{root}->[0]->{Model500}->[0] = "AAA\nBBB\nCCC\n";
$xml->{root}->[0]->{Model500}->[1] = "111\n222\n333\n";
XMLout(
$xml,
KeepRoot => 1,
NoAttr => 1,
OutputFile => $xml_file,
);