Cod*_*nny 4 xml math shell awk sed
以下是一些需要处理的xml文件的摘录:
<BirimAdi>Adet</BirimAdi>
<BirimCarpan>1</BirimCarpan>
<HavaleFiyati>0</HavaleFiyati>
<HavaleFiyatiParaBirimi>TL</HavaleFiyatiParaBirimi>
<Price1>0</Price1>
<SatisFiyati1ParaBirimi>TL</SatisFiyati1ParaBirimi>
<Isk1>0</Isk1>
<SatisFiyati2>0</SatisFiyati2>
Run Code Online (Sandbox Code Playgroud)
我需要做的是获取标签之间的值,并对其进行以下数学运算.
Price1 = round(Price1)-0.1;
Run Code Online (Sandbox Code Playgroud)
该脚本应该对指定路径中的所有xml文件执行此操作.
我考虑使用'sed'或'awk',但我不确定这可以在sed中轻松完成.使用xmllint对我来说太过分了.有任何想法吗?我是这些实用程序的新手,所以无法想到找到我想要的那个正则表达式是:
/<\s*Price1[^>]*>([^<]*)<\s*\/\s*Price1\s*>/
Run Code Online (Sandbox Code Playgroud)
我会使用XML
解析器来完成这项工作.例如,XML::Twig
.这是一个例子:
#!/usr/bin/env perl
use warnings;
use strict;
use XML::Twig;
for my $f ( @ARGV ) {
my $twig = XML::Twig->new(
twig_handlers => {
'Price1' => sub { $_->set_text( sprintf( "%.1f", int( $_->text) - 0.1 ) ) },
},
pretty_print => 'indented',
)->parsefile( $f )->print;
}
Run Code Online (Sandbox Code Playgroud)
假设文件名是script.pl
和xmlfile
包含内容的测试文件:
<root>
<BirimAdi>Adet</BirimAdi>
<BirimCarpan>1</BirimCarpan>
<HavaleFiyati>0</HavaleFiyati>
<HavaleFiyatiParaBirimi>TL</HavaleFiyatiParaBirimi>
<Price1>3.3</Price1>
<SatisFiyati1ParaBirimi>TL</SatisFiyati1ParaBirimi>
<Isk1>0</Isk1>
<SatisFiyati2>0</SatisFiyati2>
</root>
Run Code Online (Sandbox Code Playgroud)
运行它像:
perl script.pl xmlfile
Run Code Online (Sandbox Code Playgroud)
产量:
<root>
<BirimAdi>Adet</BirimAdi>
<BirimCarpan>1</BirimCarpan>
<HavaleFiyati>0</HavaleFiyati>
<HavaleFiyatiParaBirimi>TL</HavaleFiyatiParaBirimi>
<Price1>2.9</Price1>
<SatisFiyati1ParaBirimi>TL</SatisFiyati1ParaBirimi>
<Isk1>0</Isk1>
<SatisFiyati2>0</SatisFiyati2>
</root>
Run Code Online (Sandbox Code Playgroud)