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