我有一个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>
答案 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;'