使用 perl one liner 替换 xml 中的标签和值

Replace a tag and value in xml using perl one liner

我需要使用 perl one liner 将日期标签中的日期值 2016-11-02 替换为新值

<header>
            <name>V5 CDS Composites</name>
            <version>1.1a</version>
            <date>2016-11-02</date>

    </header>

我可以使用 xml libxml 做到这一点,但我想使用 perl one liner 以最短的方式做到这一点。我不能只使用 2016-11-02,因为有多个带有不同标签的实例。

我在 shell 中执行此操作,其中标签和值在变量中

试试下面的一款衬垫

perl -pe 'my $new_date = "2016-12-12"; s/<date>.+/<date>$new_date<\/date>/g' xml.txt

这里

-p use to iterate the loop on a file and the line gets print after that.

-e for execute the script

还有另一个开关用于执行对原始文件的更改。这是 -i 。然后你想复制原始文件意味着oneliner应该是

perl -i.copy -pe 'my $new_date = "2016-12-12"; s/<date>.+/<date>$new_date<\/date>/g' xml.txt

文件将存储为 .copy 扩展名。

这一行完成了工作并在进行替换之前保存了文件

perl -pi.back -e 's~(?=<date>)[\d-]+(?=</date>)~2016-11-18~' file.xml

使用 perl 一个 XML 感知工具:

perl -MXML::Twig -0777 -e '$t=XML::Twig->parse(<>);$_->set_text('2017-01-01') for $t ->get_xpath('.//date');$t->print'

或者也许:

perl -MXML::Twig -0777 -e 'XML::Twig->new(twig_handlers=>{date=>sub{$_->set_text("2017-01-01")}})->parse(<>)->print'

(略短,取决于是否更容易阅读)。

它在技术上比此处的某些替代方案稍长,但它具有作为 实际 XML 解析解决方案的好处。

您也可以改用 parsefile_inplace,在文件上使用 'sed like'。您可能还会发现设置 pretty_print 很有用,可以重新格式化 XML.