使用Perl替换语句(s //)我想通过在某些项目中添加属性来修改某些XML(如果缺少)。这是一个例子:
...
<car color="red" owner="john">...</car>
<car color="green" age="3">...</car>
...
假设我想在无车的车上添加默认车主。我尝试了以下但没有成功:
s/(<car[^>]*)(?!owner="[^"]*")(.*>)|$1 owner="steve"$2/iUg
任何帮助表示感谢。
答案 0 :(得分:5)
虽然您可以使用正则表达式,但始终建议使用XML解析器。
Perl / CPAN产品包括:
将您的XML文档视为Perl数据结构
老人
对于SAX解析需求
用于以块为单位对XML文档进行内存高效处理
我个人最喜欢的
答案 1 :(得分:1)
我通常使用XML::XSH2进行XML操作。您的问题可以轻松解决:
for //car[not(@owner)] set @owner "steve" ;
答案 2 :(得分:0)
你可以尝试这个
#!/usr/bin/perl -w
$str = <<EOF;
<car color="red" owner="john">.*#?§<car color="pink"> </car>.*#?§</car>
<car color="green" age="3">.*#?§</car>
<car owner="bill"></car>
EOF
$str =~ s/(<car(?![^>]+?owner))([^>]*?)>/$1$2 owner="steve">/g;
print $str;
最好的问候
PS:很可能这是一个错字,但无论如何,正则表达式中的竖线必须用斜线替换