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

使用Perl one liner更改XML文件的多行,xml,perl,Xml,Perl,我正在尝试使用Perl一行程序更改XML文件。XML文件设置为 <NameBool name="Hardware Enabled"> <BoolConfig> <value>false 假的 我需要将文件更改为true。我已经编写了一个似乎可以执行的单行程序,但它实际上从未更改文件。我做错了什么 代码 perl-p07777i-e的/\n\n文件名/\n\ntrue/m* 正如上面的评论所说,您没有考虑到文件中存

我正在尝试使用Perl一行程序更改XML文件。XML文件设置为

<NameBool name="Hardware Enabled">
    <BoolConfig>
       <value>false

假的
我需要将文件更改为true。我已经编写了一个似乎可以执行的单行程序,但它实际上从未更改文件。我做错了什么

代码
perl-p07777i-e的/\n\n文件名/\n\ntrue/m*

正如上面的评论所说,您没有考虑到文件中存在缩进。如果没有太多其他内容,那么这个非常简单的正则表达式如何:

s/\bfalse\b/true/

但是,如果还有其他出现的
false
,则必须坚持使用正则表达式,但要添加空格。通过这样做,您可以保持缩进等:

s/(<NameBool name="Hardware Enabled">\s+<BoolConfig>\s+<value>)false/${1}true/m
s/(\s+\s+)false/${1}true/m
请注意,示例数据和正则表达式之间存在两个差异:

  • 示例:
    NameBool
    ,正则表达式:
    NamedBool
  • 示例:
    “硬件启用”
    ,正则表达式:
    “硬件启用”

看一看。

为什么需要一个衬里?编写一个更易于调试和维护的适当(小)脚本真的那么复杂吗

无论如何,只要您的线路足够长;--)


您不需要在正则表达式中查找XML标记之间的空格吗?谢谢,这是我需要的。我需要它是一行,因为我实际上在python脚本中使用它作为调用。为什么不使用python库来处理XML呢?
s/(<NameBool name="Hardware Enabled">\s+<BoolConfig>\s+<value>)false/${1}true/m
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")'