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

时间:2016-11-18 09:01:16

标签: xml perl shell xml-libxml

我需要使用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中执行此操作,其中标记和值在变量

3 个答案:

答案 0 :(得分:2)

使用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来使用它,就像&#39;在一个文件上。您可能还会发现设置pretty_print非常有用,可以重新格式化XML。

答案 1 :(得分:1)

尝试以下一个班轮

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扩展名。

答案 2 :(得分:1)

这一个班轮在完成替换之前完成工作并保存文件

lat@long
4.4283333333333331e+01@-1.0550000000000000e+02
3.1366000000000000e+01@-1.0371500000000000e+02
2.5250000000000000e+01@1.0538333000000000e+02