2015-11-17 193 views
1
my $string = "<name> 
       POWERDOWN_SUPPORT 
       </name> 
       <bool> 
       <value> true </value> 
       </bool>"; 

    if ($string=~ s/POWERDOWN_SUPPORT<\/name><bool><value>.*?<\/value>/<false>/ims) { 
    print "$string\n"; 
    } 

如何讓替換工作?多行搜索和替換

預期輸出:

<name> 
    POWERDOWN_SUPPORT 
</name> 
<bool> 
    <value> false </value> 
</bool> 
+0

看起來像'xml'。是嗎?如果是這樣,比正則表達式有更好的方式 - 比如XML解析器。 – Sobrique

回答

1

這可能工作:

s/(POWERDOWN_SUPPORT\s*?<\/name>\s*?<bool>\s*?<value>).*?(<\/value>)/$1 false $2/s 
+0

謝謝你的工作。 – Emman

1

使用XML感知工具,解析XML與正則表達式又硬又容易出錯。

例如,xsh,包裝周圍XML::LibXML

open file.xml ; 
my $v = //name[normalize-space(.)='POWERDOWN_SUPPORT']/following-sibling::bool/value[normalize-space(.)='true']; 
set $v/text() 'false' ; 
save :b ; 
+0

因爲你已經提到XML解析通過正則表達式是困難和容易出錯我試過這個,但得到以下錯誤'沒有模式之間的空間和以下字是不贊成在so.pl第5行。' – Emman

+0

你安裝了XML :: XSH2嗎? – choroba