2011-10-06 52 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问题。

相关问题