正则表达式从命令行替换节点内 xml 文件中的文本

正则表达式从命令行替换节点内 xml 文件中的文本

我有一个 XML 文件,我想将 g:gtin 节点的多个实例中开始和结束标记之间的所有内容替换为空。

这可以从命令行使用 sed 或类似的东西吗?

<g:gtin>31806831001</g:gtin>

答案1

针对简单情况的简单解决方案 - 请参阅我的评论:

echo "<g:gtin>31806831001</g:gtin>" | sed 's|<g:gtin>.*</g:gtin>|<g:gtin></g:gtin>|'

结果:

<g:gtin></g:gtin>

它取决于这样的假设:起始标签和结束标签位于同一行,并且该行上不超过一个标签。

由于 xml 文件通常以相同的方式一遍又一遍地生成,因此该假设可能成立。

答案2

一种使用方法perl

内容script.pl

use warnings;
use strict;
use XML::Twig;

die qq[Usage: perl $0 <xml-file>\n] unless @ARGV == 1;

my $twig = XML::Twig->new(
    twig_roots => { 
        q[g:gtin] => \&handle_gtin,
    },  
    twig_print_outside_roots => 1,
);

$twig->parsefile( shift );

sub handle_gtin {
    my ($t, $gtin) = @_; 
    $gtin->set_text( q[] );
    $gtin->print;
}

像这样运行它:

perl script.pl file.xml

相关内容