【问题标题】:Changing multiple lines of XML file using Perl one-liner使用 Perl one-liner 更改多行 XML 文件
【发布时间】:2014-05-02 14:49:46
【问题描述】:

我正在尝试使用 Perl 单行代码更改 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*

【问题讨论】:

  • 您不需要在正则表达式中查找 XML 标记之间的空格吗?

标签: xml perl


【解决方案1】:

为什么需要单线?编写一个更容易调试和维护的合适(小)脚本真的那么复杂吗?

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

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

【讨论】:

  • 我需要它是一行,因为我实际上将它用作 python 脚本中的调用。
  • 那你为什么不用Python库来处理XML呢?
【解决方案2】:

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

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

【讨论】:

  • 谢谢,这得到了我需要的东西。
猜你喜欢
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 2015-08-19
  • 2014-03-19
  • 2017-04-02
  • 1970-01-01
  • 2014-07-31
相关资源
最近更新 更多