2010-10-07 49 views
0

早上全部, 我正在編寫一個bash腳本以從給定目錄中的所有文件中提取某些XML標記的值。我決定通過標記每行並返回相關標記來做到這一點。問題在於它沒有正確標記,我無法弄清楚爲什麼。這裏是最小的例子,我能有這樣的重建問題字符串標記化算法不會令牌化

#!/bin/bash 
for file in `ls $MY_DIRECTORY` 
do 
    for line in `cat $MY_DIRECTORY/$file` 
    do 
     LOCALIFS=$IFS 
     IFS=<>\" 

     TOKENS=($line) 
     IFS=$LOCALIFS 
     echo "Token 0: ${TOKENS[0]}" 
     echo "Token 1: ${TOKENS[1]}" 
     echo "Token 2: ${TOKENS[2]}" 
     echo "Token 3: ${TOKENS[3]}" 

    done 
done 

我猜問題是我的,是與本身使用IFS(即貓操作),在一個循環內IFS擺弄的事,但是這以前從未遇到過問題。
任何想法?

感謝, 裏克

+0

請給ASN例如線從文件和descrivbe如何輸出是不正確 – 2010-10-07 11:20:14

+0

許多初學者錯誤('我在$(ls)',UUOC ......)在這裏。參見[bash陷阱](http://mywiki.wooledge.org/BashPitfalls)。 – Benoit 2010-10-07 11:49:21

回答

1

使用更好的工具來解析XML,理想的應該是一個分析器,但如果您的要求很簡單,你知道你的XML是如何構成的,單純的字符串操作就足夠。例如,XML文件,你想要得到的tag3

$ cat file 
blah 
<tag1>value1 </tag1> 
<tag2>value2 </tag2> 
<tag3>value3 
</tag3> 
blah 

$ awk -vRS="</tag3>" '/tag2/{ gsub(/.*tag3>/,"");print}' file 
value3 

值,從而遍歷目錄

for file in *.xml 
do 
    value="$(awk -vRS="</tag3>" '/tag2/{ gsub(/.*tag3>/,"");print}' "$file")" 
    echo "$value" 
done 
+0

我冒昧地在你的回答中加上引號,希望你不會被冒犯。 – Benoit 2010-10-07 14:11:00

+0

謝謝,但它並不重要,因爲你可以隨時把報價放在「價值」 – ghostdog74 2010-10-07 14:22:21