OSX: 一个线性数组追加使用默认 read/write plist 文件
OSX: One liner array append using defaults read/write plist file
我有两个客户给的两个 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>
而且我需要在<string>THIRDONE</string>
之后添加TESTAPP-TESTAPP-TESTAPP
有什么想法吗?
我已经试过了:defaults write /Applications/SecondTestAPP/info.plist '<dict><key>TestValue</key><array><string>TESTAPP-TESTAPP-TESTAPP</string></array></dict>'
但是没用。
使用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"
]
}
}
有点长,但还是一行。
好的,刚刚在 10.14(测试版)和 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(例如有很多子指令等的东西),建议使用 plutil 或使用 python.
中内置的 plist 编辑功能
我有两个客户给的两个 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>
而且我需要在<string>THIRDONE</string>
之后添加TESTAPP-TESTAPP-TESTAPP
有什么想法吗?
我已经试过了:defaults write /Applications/SecondTestAPP/info.plist '<dict><key>TestValue</key><array><string>TESTAPP-TESTAPP-TESTAPP</string></array></dict>'
但是没用。
使用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"
]
}
}
有点长,但还是一行。
好的,刚刚在 10.14(测试版)和 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(例如有很多子指令等的东西),建议使用 plutil 或使用 python.
中内置的 plist 编辑功能