2015-04-10 5 views
0

У меня есть два файла plist, данные двумя клиентами, и каждый раз мне приходится обновлять его вручную.OSX: Один массив гильз добавляет, используя файл plis для чтения/записи по умолчанию

Сначала я могу извлечь нужную строку.

defaults read /Applications/TestAPP/info.plist TestValue 
TESTAPP-TESTAPP-TESTAPP 

Во-вторых, мне нужно добавить предыдущий результат в конец массива во втором файле.

defaults read /Applications/SecondTestAPP/info.plist TestValue2 
    <key>TEST</key> 
    <array> 
     <string>FIRSTONE</string> 
     <string>SECONDONE</string> 
     <string>THIRDONE</string> 
    </array> 
</dict> 

И мне нужно, чтобы добавить TESTAPP-TESTAPP-TESTAPP после <string>THIRDONE</string>
Любые идеи?
Я уже пробовал: defaults write /Applications/SecondTestAPP/info.plist '<dict><key>TestValue</key><array><string>TESTAPP-TESTAPP-TESTAPP</string></array></dict>'
Но он не работает.

+0

defaults write info.plist TEST -array-add '{"string" = "Funky String"}' ... возможно –

+0

Или, может быть, '/ usr/libexec/PlistBuddy -c" Добавить: TEST string 'FunkyString' " info.plist' –

+0

@MarkSetchell Первый не работает. Но второй из них почти нормально, если не считать возврата: 'Добавить:": TEST "Entry уже существует" – VivienG

ответ

1

Использование plutil

Давайте начнем с PLIST:

> defaults write org.my.test '{aDict = {anArray =();};}' 

Использование plist -p для печати PLIST на стандартный вывод.

plutil -p ~/Library/Preferences/org.my.test.plist 
{ 
    "aDict" => { 
    "anArray" => [ 
    ] 
    } 
} 

Используйте plist -insert, чтобы добавить что-то к массиву

> plutil -insert aDict.anArray.0 -string a ~/Library/Preferences/org.my.test.plist 
> plutil -p ~/Library/Preferences/org.my.test.plist 
{ 
    "aDict" => { 
    "anArray" => [ 
     0 => "a" 
    ] 
    } 
} 

Ваша жизнь будет лучше, если вы можете вставить новый элемент во главе списка с индексом 0.

> plutil -insert aDict.anArray.0 -string before_a ~/Library/Preferences/org.my.test.plist 
> plutil -p ~/Library/Preferences/org.my.test.plist 
{ 
    "aDict" => { 
    "anArray" => [ 
     0 => "before_a" 
     1 => "a" 
    ] 
    } 
} 

Но если вы должны положить его в конец, то вам нужно выяснить длину массива. Мы сделаем это, сначала получив массив самостоятельно.

> plutil -extract aDict.anArray json -o - ~/Library/Preferences/org.my.test.plist 
["before_a","a"] 

Чтобы получить количество элементов, вы можете подсчитать количество «», а затем добавить 1 - но это будет иметь ошибки, если строки запятые в них.

> echo "$(plutil -extract aDict.anArray json -o - ~/Library/Preferences/org.my.test.plist | grep -F -o ',' | wc -l) + 1" | bc 
2 

Или вы можете установить jq, инструмент командной строки для чтения и управления json.

> brew install jq 
> plutil -extract aDict.anArray json -o - ~/Library/Preferences/org.my.test.plist | jq '. | length' 
2 

Затем вы можете использовать это значение, чтобы добавить свое значение в конец массива.

> plutil -insert aDict.anArray.$(plutil -extract aDict.anArray json -o - ~/Library/Preferences/org.my.test.plist | jq '. | length') -string b ~/Library/Preferences/org.my.test.plist 
> plutil -p ~/Library/Preferences/org.my.test.plist 
{ 
    "aDict" => { 
    "anArray" => [ 
     0 => "before_a" 
     1 => "a" 
     2 => "b" 
    ] 
    } 
} 

Вы также хотите использовать plutil, чтобы получить значение из другого списка свойств

> plutil -extract KEYPATH json -o - OTHER_PLIST 
YOUR_VALUE 
> plutil -insert aDict.anArray.$(plutil -extract aDict.anArray json -o - ~/Library/Preferences/org.my.test.plist | jq '. | length') -string $(plutil -extract KEYPATH json -o - OTHER_PLIST) ~/Library/Preferences/org.my.test.plist 
> plutil -p ~/Library/Preferences/org.my.test.plist 
{ 
    "aDict" => { 
    "anArray" => [ 
     0 => "before_a" 
     1 => "a" 
     2 => "b" 
     3 => "YOUR_VALUE" 
    ] 
    } 
} 

Это немного долго, но один вкладыш, тем не менее.

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

  • Нет связанных вопросов^_^