使用Perl one-liner更改多行XML文件

时间:2014-05-02 14:49:46

标签: xml perl

我正在尝试使用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*

2 个答案:

答案 0 :(得分:2)

为什么需要一个单行班轮?编写一个更容易调试和维护的适当(小)脚本真的很复杂吗?

无论如何,只要你的行足够长; - )

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")'

答案 1 :(得分:0)

正如上面的评论中所述,您没有考虑到文件中存在缩进。如果那里没有其他的东西,那么这个非常简单的正则表达式怎么样:

s/\bfalse\b/true/

如果有false的其他情况,你将不得不坚持你的正则表达式,但添加空格。你可以保持缩进等,这样做:

s/(<NameBool name="Hardware Enabled">\s+<BoolConfig>\s+<value>)false/${1}true/m

请注意,您的示例数据与正则表达式之间存在两个差异:

  • 示例:NameBool,正则表达式:NamedBool
  • 示例:"Hardware Enabled",正则表达式:"HardwareEnabled"

看看http://regex101.com/r/wZ8bN5