2016-11-18 70 views
0

替換XML標籤和價值,我需要用一個perl一個襯墊用perl一個襯墊

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

    </header> 

我能做到這一點,以取代與新價值的日期標籤的日期值2016年11月2日使用xml libxml,但希望使用perl one liner以最短的方式執行此操作。我不能僅僅使用2016-11-02,因爲有不同標籤的多個實例。

我一個外殼內這樣做,其中的標籤和值都在裏面的變量

+0

你想只使用'perl'而不是任何正確的'xml'感知工具? – Inian

+0

是的,只想用perl – BRATVADDI

+0

@BRATVADDI'awk -F'<|>'-v newDate =「2222-11-00」'/ /{gsub(/ 2016-11-02 /,newDate,$ 3)} 1 'inputfile',如果你確定awk。但是,我不鼓勵你使用xml不知道的工具。 –

回答

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擴展。

+0

正在尋找這個。需要雙引號作爲shell不會解決變量否則 – BRATVADDI

1

這一個班輪做的工作和文件做substituion

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

展望未來,看後面是很酷的想法:) – mkHun

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來代替文件上的'sed like'。您也可能會發現設置pretty_print對重新格式化XML非常有用。