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