如果文件中有列,则可以轻松进行算术运算。但是,如果要读取xml文件,请在算术上修改特定标记,然后将更改写入相同的文件。
以下面的代码段为例:
<product>
<programname>Bla</programname>
<programurl>blah.com</programurl>
<catalogname>beep it</catalogname>
<lastupdated>ridiculous</lastupdated>
<name>Another pile of garbage</name>
<keywords>whatever</keywords>
<description>random</description>
<currency>USD</currency>
<price>3.99</price>
<buyurl>deeplyrandomurl.html</buyurl>
</product>
<product>
<programname>nowheretownthing</programname>
<programurl>sick.com</programurl>
<catalogname>beep it</catalogname>
<lastupdated>ridiculous</lastupdated>
<name>Another pile of garbage</name>
<keywords>whatever</keywords>
<description>random</description>
<currency>USD</currency>
<price>10.78</price>
<buyurl>deeplyrandomurl.html</buyurl>
</product>
在庞大的xml文件中有许多这样的<product>
块。我们如何修改每个<price>
子标签并将更改写入文件?有什么建议吗?
答案 0 :(得分:1)
使用p.awk
作为awk
计划:
p.awk
{
if ($L ~ /\<price>/)
{
split($L,a,">");
split(a[2],b,"<");
gsub(">.*<",">"2*b[1]"<",$L);
}
print $L
}
然后
cat file | awk -f p.awk
答案 1 :(得分:0)
如果你想在这里使用sed是一个可能的解决方案。您在bash脚本中编写以下代码(比如说script.sh):
#!/bin/bash
tr '\n' ';' < XMLFILE > TEMPFILE
c=1
for i in $(sed -n 's/.*price>\([0-9]*\.*[0-9]*\)<\/price>/\1/p' XMLFILE); do
i=$(awk -v i="$i" 'BEGIN{print (i*2)}')
sed -i "s/<price>\([0-9]*\.*[0-9]*\)<\/price>/<price>$i<\/price>/$c" TEMPFILE
c=$((c+1))
done
tr ';' '\n' < TEMPFILE > XMLFILE
rm -f TEMPFILE
然后你只需执行脚本:
./script.sh