【问题标题】:Adding text if missing (Perl REGEXP)如果缺少则添加文本(Perl REGEXP)
【发布时间】:2012-01-23 04:57:12
【问题描述】:

使用 Perl 替换语句 (s//) 我想修改一些 XML,如果缺少某些项目,则添加一个属性。这是一个例子:

...
<car color="red" owner="john">...</car>
<car color="green" age="3">...</car>
...

假设我想为无人驾驶汽车添加一个默认所有者。我尝试了以下但没有成功:

s/(<car[^>]*)(?!owner="[^"]*")(.*>)|$1 owner="steve"$2/iUg

任何帮助表示赞赏。

【问题讨论】:

标签: regex perl sed


【解决方案1】:

虽然您可以使用正则表达式,但始终建议使用 XML 解析器。

Perl/CPAN 产品包括:

【讨论】:

【解决方案2】:

我通常使用XML::XSH2 进行 XML 操作。你的问题可以在里面轻松解决:

for //car[not(@owner)] set @owner "steve" ;

【讨论】:

    【解决方案3】:

    你可以试试这个

    #!/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:很可能这是一个错字,但无论如何,你的正则表达式中的竖线必须用斜杠替换

    【讨论】:

    • 不需要空的while循环。 /g 已经确保它运行在 $str 的所有元素上。循环只是让它运行两次,第二次它不匹配任何东西,所以它返回 0(匹配的数量)。这很容易变成无限循环,例如:s{foo}{foofoo}g
    • @Schwern 感谢您的评论。我记得:m//g != s///g最好的问候
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    相关资源
    最近更新 更多