[英]Replace a tag and value in xml using perl one liner
我需要使用perl one襯墊將日期標簽中的日期值2016-11-02替換為新值
<header>
<name>V5 CDS Composites</name>
<version>1.1a</version>
<date>2016-11-02</date>
</header>
我可以使用xml libxml來執行此操作,但希望使用perl one內襯以最短的方式執行此操作。 我不能僅使用2016-11-02,因為有多個帶有不同標簽的實例。
我在標記和值都在變量內的外殼中執行此操作
使用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很有用。
嘗試以下一種襯墊
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.