1

我有两个客户提供的两个 plist 文件,每次我都必须手动更新它。

第一个我可以提取我需要的字符串。

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>'

4

2 回答 2

7

采用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从其他 plist 中获取值

> 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"
    ]
  }
}

它有点长,但仍然是一条线。

于 2016-12-19T04:38:24.717 回答
0

好的,刚刚在 10.14(beta)和 10.13.6 上测试了它,它适用于一个简单的plist:

一般格式为:

defaults write YOUR_PATH_TO_PLIST/PLIST.INFO ARRAY_KEY_NAME -array-add VALUE_TO_ADD

或者在这种特殊情况下:

defaults write /Applications/SecondTestAPP/info.plist TEST -array-add TESTAPP-TESTAPP-TESTAPP

对于更复杂的 plist(例如,有很多 sub-dicts 的东西等),建议使用 plutil 或使用 python 中的内置 plist 编辑功能。

于 2018-07-12T19:40:21.007 回答