OSX:使用默认读/写plist文件的一个内衬数组追加

Viv*_*enG 0 macos plist defaults

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

首先,我可以提取所需的字符串。

defaults read /Applications/TestAPP/info.plist TestValue
TESTAPP-TESTAPP-TESTAPP
Run Code Online (Sandbox Code Playgroud)

第二个,我需要将先前的结果附加到第二个文件中的数组末尾。

defaults read /Applications/SecondTestAPP/info.plist TestValue2 
  <key>TEST</key>
    <array>
        <string>FIRSTONE</string>
        <string>SECONDONE</string>
        <string>THIRDONE</string>
    </array>
</dict> 
Run Code Online (Sandbox Code Playgroud)

而我需要添加TESTAPP-TESTAPP-TESTAPP<string>THIRDONE</string>
的任何想法?
我已经尝试过: defaults write /Applications/SecondTestAPP/info.plist '<dict><key>TestValue</key><array><string>TESTAPP-TESTAPP-TESTAPP</string></array></dict>'
但是它不起作用。

Liy*_*ang 5

使用 plutil

让我们从一个plist开始:

> defaults write org.my.test '{aDict = {anArray = ();};}'
Run Code Online (Sandbox Code Playgroud)

用于plist -p将plist打印到stdout。

plutil -p ~/Library/Preferences/org.my.test.plist
{
  "aDict" => {
    "anArray" => [
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

用于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"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您可以将新项目插入索引为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"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果必须将其放在末尾,则需要弄清楚数组的长度。我们将首先获取数组本身。

> plutil -extract aDict.anArray json -o - ~/Library/Preferences/org.my.test.plist
["before_a","a"]
Run Code Online (Sandbox Code Playgroud)

要获取元素数量,您可以计算','的数量,然后加1-但是如果字符串中包含逗号,则会出现错误。

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

或者,您可以安装jq,这是一种用于读取和操作json的命令行工具。

> brew install jq
> plutil -extract aDict.anArray json -o - ~/Library/Preferences/org.my.test.plist | jq '. | length'
2
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用该值将您的值附加到数组的末尾。

> 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"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

您还需要使用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"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

它有点长,但是还是单线的。