示例XML:
<parts>
<title>computer parts</title>
<components>
<hardware>motherboard</hardware>
<id>1234</id>
</components>
<part>
<item>motherboard</item>
<manufacturer>asus</manufacturer>
<model>p3b-f</model>
<cost> 123.00</cost>
</part>
<components>
<hardware>video card</hardware>
<id>2345</id>
</components>
<part>
<item>video card</item>
<manufacturer>ati</manufacturer>
<model>all-in-wonder pro</model>
<cost> 160.00</cost>
</part>
<components>
<hardware>sound card</hardware>
<id>3456</id>
</components>
<part>
<item>sound card</item>
<manufacturer>creative labs</manufacturer>
<model>sound blaster live</model>
<cost> 80.00</cost>
</part>
</parts>
在上面的示例XML中,我需要先在motherboard
元素中搜索值components
;如果在那里找到了值,那么我们需要在<part>
标记下的item
元素中搜索该值,如果该值在item
标记中可用,那么我们应该得到model
代码的值。
注意:我突出显示了需要搜索的值和需要提取的值。
我怎样才能在Bash中做到这一点?
答案 0 :(得分:0)
awk '/<hardware>/,/<\/hardware>/ { match($1,/<hardware>.*<\/hardware>/);prod=substr($1,RSTART+10,RLENGTH-21) } /<item>/,/<\/item>/ { match($1,/<item>.*<\/item>/);avail=substr($1,RSTART+6,RLENGTH-13) } /<model>/,/<\/model>/ { match($1,/<model>.*<\/model>/);if (prod=="motherboard" && avail=="motherboard") { print substr($1,RSTART+7,RLENGTH-15) } }' filename
我认为这就是你的目标
/<hardware>/,/<\/hardware>/ {
match($1,/<hardware>.*<\/hardware>/)
prod=substr($1,RSTART+10,RLENGTH-21)
}
/<item>/,/<\/item>/ {
match($1,/<item>.*<\/item>/)
avail=substr($1,RSTART+6,RLENGTH-13)
}
/<model>/,/<\/model>/ {
match($1,/<model>.*<\/model>/)
if (prod=="motherboard" && avail=="motherboard") {
print substr($1,RSTART+7,RLENGTH-15)
}
}
设置搜索硬件标签。将条目存储在变量prod中。搜索项目标记并将包含的元素存储在可用中。搜索模型标签,然后如果prod和avail两个相同的主板,打印元素。