2014-07-05 45 views
0

如果文件中有列,則可以輕鬆進行算術運算。但是,如果你想讀取一個XML文件,算術修改一個特定的標籤,然後寫入更改相同。如何在awk中對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

難道要替換的價格標籤的價值?顯示帶有兩個產品標籤的示例xml文件。 –

+1

'算術修改特定標籤'明確說明。發佈示例輸出。 – sat

+0

有你去...這兩個產品標籤現在 – Identity1

回答

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 
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