Odczytywanie wartości z zagnieżdżonych słowników w skrypcie powłoki

10

Mam plik plist i jestem zainteresowany pobieraniem wartości z zagnieżdżonych słowników za pomocą skryptu powłoki. Oto struktura mojego pliku plist:

 <dict>
   <key>Countries</key>
    <dict>
        <key>USA</key>
        <dict>
           <key>Capital</key>
           <string>Washington DC</string>
           <key>Continent</key>
           <string>North America</string>
        </dict>
           <key>Italy</key>
        <dict>
           <key>Capital</key>
           <string>Rome</string>
           <key>Continent</key>
           <string>Europe</string>
        </dict>
    </dict>
 </dict>

Chcę pobrać wartość przypisaną do klucza „Kapitał”, jeśli użytkownik poda nazwę kraju.
Na przykład jeśli wykonam następujące polecenie, otrzymam pełne dane w słowniku „Kraje”.

defaults read "/Users/sameerp/Downloads/data" Countries  2>&1   

Otrzymuję następujące dane wyjściowe:

{
Italy =     {
    Capital = Rome;
    Continent = Europe;
};
USA =     {
    Capital = "Washington DC";
    Continent = "North America";
};
}

Jak zmodyfikować powyższe polecenie, aby przekazać mu klucz „Kraj” (np. USA) i pobrać wartość klucza „Kapitał”

palenie tytoniu
źródło
Więc jakie jest twoje pytanie? Co masz do tej pory Nie prosisz nas o napisanie skryptu dla ciebie, prawda?
terdon
@terdon: Nie proszę nikogo o napisanie scenariusza. Chciałem wiedzieć, czy istnieje bezpośredni sposób na uzyskanie dostępu do wartości klucza w zagnieżdżonym słowniku za pomocą polecenia „default read”.
smokinguns

Odpowiedzi:

13

wartości domyślne nie mogą tego zrobić bez większego bałaganu, ale PlistBuddy:

/usr/libexec/PlistBuddy -c "print :Countries:USA:Capital" /Users/sameerp/Downloads/data.plist
Gordon Davisson
źródło