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