2015-11-17 3 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 синтаксический анализ через regex, трудно и подвержен ошибкам. Я пробовал это, но получал следующую ошибку: «Отсутствие пробела между шаблоном и последующим словом устарело на so.pl line 5.' – Emman

+0

Установили ли вы XML :: XSH2? – choroba

Смежные вопросы