2011-10-06 37 views
0

我想尋找能爲false XML文件的所有改變屬性標籤都有效,它可以是這樣的如何在Perl中使用Regex進行搜索/替換時使用替換變量?

<repository store-diff="true" description="ACS" name="ACS" enabled="true"> 

有以及具有enabled屬性,所以我需要尋找其他行的標籤首先,這很容易,問題是替換字符串。我試過這個:

perl -p -e 's#^<repository.*enabled="true"#$1enabled="false"#g' 

但沒有運氣,沒有對文件做任何改變,我嘗試改變。或者,這不是真的,它匹配,但我無法改變ONLY =「true」將其設置爲false,它刪除剩下的行,只留下enabled =「false」...

應根據

回答

-2

我沒有測試是不可能的,但我相信這將工作:

perl -p -e 's#^(<repository.*)enabled="true"#$1enabled="false"#g' 

首先,你需要有一組以使用反向引用,所以你必須將稍後要引用的表達部分加括號。在這種情況下,我們希望從<repository一直到enabled...,因此我們將該位放在括號內。

+1

-1由於一大堆原因。 1)您沒有告訴他使用XML解析器來處理XML數據。 2)你使用s /// g和起始行錨,它只能匹配一次。 3)它也會改變 tadmc

+0

感謝您的筆記。我已經刪除了有關'\ 1'和'$ 1'的錯誤陳述 - 感謝您的提醒。至於你的其他意見:1)我沒有看到一個引人注目的理由來引入一個單行搜索和替換的XML解析器,特別是像這樣微不足道的東西。這很容易用'sed'完成。 2)OP的問題包含'g',我試圖介紹儘可能少的變化來爲他做這件事。 3)修正的重點只是指出OP已經錯過了什麼(該組),但是你是對的,他的正則表達式也會匹配類似的字符串。 –

+0

謝謝,這對我來說訣竅,因爲這是隻用一次編輯配置文件,它不需要更先進。對於真正的XML解析的東西,我更喜歡使用提供的Groovy和XML解析器 – rhellem

4
#!/usr/bin/perl 
use XML::Twig; 
my $t = XML::Twig->new(
         twig_handlers => { 
          # for repository tags, if it has the enabled 
          # attribute, set it to false. 
          repository => sub { 
           exists $_->{att}->{enabled} && 
           $_->set_att(enabled => 'false'); 
           $_->flush(); 
          }, 
         }, 
        ); 
$t->parsefile($ARGV[0]); 
$t->flush(); 

似乎爲我工作。您可能想要使用存儲庫標記的回調 - 我不確定是否要始終將enabled屬性設置爲false,即使該屬性不存在(刪除該回調中的第一行)或僅在該屬性在那裏。

好吧,它不是一個單一的線了。但是,如果你想讓它正確地完成,那不應該是這個要求。請注意,因爲這是現在解析XML,所以我們需要格式良好的XML文檔,並且我們不關心存儲庫標記是分佈在多行上,還是一行上有多個,或者其他屬性有,等等。

它也不會落入你的問題的「正則表達式」標記。但那是因爲我認爲這個標籤正在將這變成一個XY問題。