簡體   English   中英

使用Perl one-liner更改多行XML文件

[英]Changing multiple lines of XML file using Perl one-liner

我正在嘗試使用Perl one-liner更改XML文件。 XML文件設置為

<NameBool name="Hardware Enabled">
    <BoolConfig>
       <value>false

我需要將文件更改為true。 我寫了一個似乎執行的單行,但它實際上從未改變過文件。 我究竟做錯了什么?

perl -p0777i -e 's/<NamedBool name=\"HardwareEnabled\">\n<BoolConfig>\n<value>false/<NamedBool name=\"HardwareEnabled\">\n<BoolConfig>\n<value>true/m' filename*

你為什么需要單線? 編寫一個更容易調試和維護的適當(小)腳本真的很復雜嗎?

無論如何,只要你的線足夠長; - )

perl -MXML::Twig -e'XML::Twig->new( twig_handlers => { q{NameBool[@name="Hardware Enabled"]/BoolConfig/value} => sub { $_->set_text( "false")->flush; } }, keep_spaces => 1)->parsefile_inplace( "to_change.xml")'

正如上面的評論中所說,您沒有考慮到文件中存在縮進。 如果那里沒有其他的東西,這個非常簡單的正則表達怎么樣:

s/\bfalse\b/true/

但是如果有其他false發生,你將不得不堅持你的正則表達式,但添加空格。 你可以保持縮進等,這樣做:

s/(<NameBool name="Hardware Enabled">\s+<BoolConfig>\s+<value>)false/${1}true/m

請注意,您的示例數據與正則表達式之間存在兩個差異:

  • 示例: NameBool ,正則表達式: NamedBool
  • 示例: "Hardware Enabled" ,正則表達式: "HardwareEnabled"

請訪問http://regex101.com/r/wZ8bN5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM