如果不相等,Perl会替换XML文件中的字符串

时间:2016-01-13 16:16:21

标签: xml perl

我有一个XML文件,其值如下:

<values val1="4124" val2="21341"></values>
<values val1="1234" val2="231"></values>
<values val1="814" val2="8943"></values>

我希望val2在所有不平等的情况下假设val1的价值。

所以上面会变成:

<values val1="4124" val2="4124"></values>
<values val1="1234" val2="1234"></values>
<values val1="814" val2="814"></values>

这就是我所拥有的:

perl -pi -e 's,val2=\"[0-9]*\,val1=\"[0-9]*\,g;' *

我主要无法理解如何将val1的值替换为val2。我的上述代码将执行此操作:

<values val1="4124" val1="4124"></values>

2 个答案:

答案 0 :(得分:3)

perl -MXML::LibXML -e'
   my $doc = XML::LibXML->new()->parse_file($ARGV[0]);
   for my $node ($doc->findnodes("//@values")) {
      $node->setAttribute("val2", $node->getAttribute("val1"));
   }
   print($doc->toString());
' infile.xml >outfile.xml
  • $parser->parse_file解析文件。
  • $doc->findnodes在文档中查找节点。
  • $node->getAttribute获取节点的属性
  • $node->setAttribute设置节点的属性

答案 1 :(得分:0)

注意:以下内容肯定构成了一个黑客的单行。如果要正确执行此操作,请遵循建议和其他答案,并使用正确的XML解析器。

虽然使用XML解析器会更清晰,但如果您的输入与字面意义相同,那么您可以使用正则表达式匹配组。

来自文档http://perldoc.perl.org/perlrequick.html#Extracting-matches

  

分组元字符()也允许提取匹配的字符串部分。对于每个分组,匹配内部的部分进入特殊变量$ 1,$ 2等

值得一读整页。然后你可以尝试:

perl -pi -e 's/<values val1="([0-9]+)" val2="[0-9]+"><\/values>/<values val1="$1" val2="$1"><\/values>/g;'