2010-10-07 19 views
0

Matin all, J'écris un script bash pour extraire les valeurs de certaines balises XML de tous les fichiers d'un répertoire donné. J'ai décidé de le faire en symbolisant chaque ligne et en retournant le jeton relavent. Le problème est que ce n'est pas un tokenizing correctement et je ne peux pas vraiment comprendre pourquoi. Voici l'exemple plus petit que je pouvais faire qui reconstitue la questionL'algorithme de tokenisation de chaînes ne va pas tokeniser

#!/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 

Je devine que la question est de faire avec mon jongler avec IFS dans une boucle qui utilise elle-même IFS (à savoir l'opération de chat), mais n'a jamais été un problème avant.
Des idées?

Merci, Rik

+0

S'il vous plaît donner asn exemple de ligne à partir du fichier et descrivbe comment la sortie est incorrect –

+0

Plusieurs débutants des erreurs ('for i in $ (ls)', UUOC ...) ici. Voir [bash pièges] (http://mywiki.wooledge.org/BashPitfalls). – Benoit

Répondre

1

Utilisez un meilleur outil pour analyser XML, idéalement, il devrait être un analyseur, mais si votre exigence est simple et vous savez comment votre xml est structuré, la manipulation de chaînes simples pourraient suffire. Par exemple, le fichier xml et que vous voulez obtenir la valeur de tag3

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

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

ainsi itérer sur votre répertoire

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

J'ai pris la liberté de mettre des citations dans votre réponse, j'espère que vous ne serez pas offensé. – Benoit

+0

merci mais ce n'est pas grave, puisque vous pouvez toujours mettre des citations plus tard pour "valeur" – ghostdog74