2010-08-13 7 views
3

Alors voici mon problème. Comment puis-je extraire ces chaînes en 3 variables avec un script bash?extraire les cordes de plist avec script bash, peut-être sed?

donc de ceci:

<key>GameDir</key> <string>C:/Program Files/</string> <key>GameEXE</key> <string>C:/Program Files/any.exe</string> <key>GameFlags</key> <string>-anyflag</string> 

Je veux:

GameDir=C:/Program Files/ 
GameEXE=C:/Program Files/any.exe 
GameFlags=-anyflag 

Exemple de script:

echo GameDir 
echo GameEXE 
echo GameFlags 

Résultat:

C:/Program Files/ 
C:/Program Files/any.exe 
-anyflag 

L'ordre des clés ne change pas, seulement les chaînes elles-mêmes. J'utilise OS X, donc il doit s'agir d'une commande qui fonctionne sur OS X. Peut-être que cela pourrait fonctionner avec sed?

Merci Drakulix

Répondre

3

En supposant version Bash> = 3,2

string='<key>GameDir</key> <string>C:/Program Files/</string> <key>GameEXE</key> <string>C:/Program Files/any.exe</string> <key>GameFlags</key> <string>-anyflag</string>' 

ou

string=$(<file) 

et

pattern='<key>([^<]*)</key>[[:blank:]]*<string>([^<]*)</string>[[:blank:]]*' 
pattern=$pattern$pattern$pattern 
[[ $string =~ $pattern ]] # extract the matches into ${BASH_REMATCH[@]} 
for ((i=1; i<${#BASH_REMATCH[@]}; i+=2)) 
do 
    declare ${BASH_REMATCH[i]}="${BASH_REMATCH[i+1]}" # make the assignments 
done 
echo $GameDir # these were missing dollar signs in your question 
echo $GameEXE 
echo $GameFlags 
+0

Maintenant ça marche. Super! Big THX! – Drakulix

+0

@Drakulix: Je suis content que ça marche. Vous pouvez marquer la réponse comme acceptée. –

0

vous pouvez utiliser awk, cela fonctionne pour mul tiline et plusieurs clés, valeurs de chaîne.

$ cat file 
<key>GameDir</key> <string>C:/Program Files/ 
    </string> 
<key>GameEXE</key> 
    <string>C:/Program Files/any.exe 
</string> <key>GameFlags</key> <string>-anyflag</string> 

$ awk -vRS="</string>" '/<key>/{gsub(/<key>|<string>|\n| +/,"") ; sub("</key>","=") ;print}' file 
GameDir=C:/ProgramFiles/ 
GameEXE=C:/ProgramFiles/any.exe 
GameFlags=-anyflag 

Utilisez eval pour créer les variables

$ eval $(awk -vRS="</string>" '/<key>/{gsub(/<key>|<string>|\n| +/,"") ; sub("</key>","=") ;print}' file) 
$ echo $GameDir 
C:/ProgramFiles/ 
6

Vous pouvez utiliser /usr/libexec/PlistBuddy pour ce qui semble être inclus dans OS X depuis au moins 10,5 (man page). Exemple:

file="$HOME/yourfile" 
/usr/libexec/PlistBuddy -c "Print" "$file" 

Et vous pouvez assigner les vars qui vous intéressent comme ceci:

for var in GameDir GameEXE GameFlags ; do 
    val=$(/usr/libexec/PlistBuddy -c "Print $var" "$file") 
    eval "export $var='$val'" 
    echo "$var = $val" 
done 

Il semble plus lisible que bash/sed/awk regexes, et comme il est spécifique à l'plist outil, je présume qu'il est fiable pour extraire des valeurs. Sachez simplement que les touches sont sensibles à la casse.

+0

Je pourrais remplacer 'eval' par' declare -x $ var = "$ val" ' – chepner