2010-06-18 51 views
0
@ubuntu:/tmp$ cat one.xml 
<?xml version="1.0" encoding="UTF-8"?> 
    <e2frontendstatus> 
    <e2snrdb> 
     12.10 dB 
    </e2snrdb> 
    <e2snr> 
     75 % 
    </e2snr> 
    <e2ber> 
     0 
    </e2ber> 
    <e2acg> 
     99 % 
    </e2acg> 
    </e2frontendstatus> 
    @ubuntu:/tmp$ sed -n -e 's/.*<e2ber>\([0-9][0-9]*\)<\/e2ber>.*/\1/p' one.xml 
    @ubuntu:/tmp$ 

我想獲取值之間。但它不工作,我做錯了什麼?grep,xml問題

+0

它不工作,因爲你必須在那裏換行......這將是可行的與SED或AWK,我敢肯定,但在Perl很可能會更幸福......你有可用? – Cascabel 2010-06-18 22:07:51

+0

問題是,sed一次將正則表達式應用於一行。由於位於不同的行上,因此它們不與表達式匹配。 您可以更改文件格式類似?那麼你可以更容易地識別這條線。 – 2010-06-18 22:09:48

+0

我們應該問的另一個問題是您的確切要求。我知道你的資源有限,所以你不會完全解析XML,所以你的健壯性會受到限制。我希望,至少可以指望XML文件不會做太瘋狂。 – Cascabel 2010-06-18 22:09:55

回答

1

你在找什麼價值?你知道Linux的grep有一個「After context」和「Before Context」命令行參數嗎?這可能是提取您要查找的信息的最簡單方法。

例如,如果你想獲得行後的值,你可以做這樣的事情:

$ grep -A1 "<e2ber>" | tail -1 
+0

簡單,像魅力一樣工作!非常感謝你! – Peter 2010-06-19 07:03:28

2

用正則表達式處理XML是不是一個很好的主意,你可能想看看像xmlstarlet爲此提取的命令行工具。

xmlstarlet sel -t -v "//e2ber" one.xml 
+1

謝謝你的答案,但我的嵌入式系統(衛星接收機),其中無法運行xmlstarlet(這是一個非常好的工具)上運行這個小命令:/。 所有其他的Linux命令可用,grep的,sed的.. – Peter 2010-06-18 22:04:28

+0

可以在安裝xmllint? – reinierpost 2010-06-18 22:16:49

+0

reinerpost:Nothing:| – Peter 2010-06-18 22:38:15

1

如果你在上面的回答中提到的grep -A選項,Unix命令tr在你的系統上,你可以使某些東西合理健壯。

這個命令應該得到適當的值:

grep -A2 '<e2ber>' one.xml | \ 
    tr -d '\n' | \ 
    sed -n -E -e 's/.*<e2ber>[[:blank:]]*([0-9][0-9]*)[[:blank:]]*<\/e2ber>.*/\1/p' 

這應該工作的XML文件是否被格式化爲<e2ber>0</e2ber>

<e2ber> 
    0 
</e2ber> 

grep的將獲取足夠的線路包括關閉標記,tr將使這一行很長,並且sed將提取該值。我更新了sed中的正則表達式以忽略值周圍的空白。

這仍然可能有問題,如果XML文件是雙倍行距-e.g.

<e2ber> 

0 

</e2ber> 

您可以通過事先通過tr -s '\n'運行XML文件來解決此問題。這將把多個換行符壓縮成一個換行符。