2010-10-07 51 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