2010-08-13 2 views
3

Итак, вот моя проблема. Как извлечь эти строки в 3 переменные с помощью сценария bash?извлекать строки из plist с скриптом bash, может быть, sed?

Так из-за этого:

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

Я хочу:

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

Пример сценария:

echo GameDir 
echo GameEXE 
echo GameFlags 

Результат:

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

Порядок клавиш не изменяется, только сами строки. Я использую OS X, так что это должна быть команда, которая работает из коробки на OS X. Возможно, это может сработать с sed?

Благодаря Drakulix

ответ

3

Предполагая, что версия 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>' 

или

string=$(<file) 

и

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

Теперь он работает. Отлично! Большой THX! – Drakulix

+0

@ Drakulix: Я рад, что он работает. Вы можете отметить ответ, как принято. –

0

вы можете использовать AWK, это работает для мул tiline и множественный ключ, строковые значения.

$ 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 

Использование Eval для создания переменных

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

Вы могли бы использовать /usr/libexec/PlistBuddy для этого, который, как представляется, включены в OS X, так как, по крайней мере 10,5 (man page). Пример:

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

И вы могли бы назначить ВАР вы заинтересованы, как это:

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

кажется более удобным для чтения, чем Баш/SED/AWK регулярных выражений, и так как это специфическая PLIST- инструмент, я полагаю, он надежен для извлечения значений. Просто имейте в виду, что ключи чувствительны к регистру.

+0

Я могу заменить 'eval'' declare -x $ var = "$ val" ' – chepner

Смежные вопросы