key*_*olo 1 linux command-line xml sed
看看下面的文字,我该如何替换多行文字?
<Model500>
ABC
BCD
CDE
</Model500>
<Model500>
123
234
345
</Model500>
Run Code Online (Sandbox Code Playgroud)
输出可能如下所示
<Model500>
AAA
BBB
CCC
</Model500>
<Model500>
111
333
555
</Model500>
Run Code Online (Sandbox Code Playgroud)
我想sed使用 Bash 的任何命令行实用程序来完成此操作。我应该使用循环来完成这个吗?
使用适当的xml工具,在 shell 中,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
Run Code Online (Sandbox Code Playgroud)
表达式//Model500[2]是一个Xpath 表达式
您需要将您的 xml 用如下标签括起来:
<root>
...
</root>
Run Code Online (Sandbox Code Playgroud)
是 XML 有效的。我希望您出于问题的目的剪切了 XML 文件。
您还可以使用python、perl、ruby等...和适当的 xml 库。
在perl 中:
#!/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,
);
Run Code Online (Sandbox Code Playgroud)