如何使用PlistBuddy向plist字典添加多个条目

时间:2016-03-02 20:18:52

标签: macos bash plist

在我的Info.plist文件中,我想修改shell上的Plist文件,如下所示:

<plist version="1.0">
<dict>
    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>urlname-1</string>
        </dict>
    </array>
</dict>
</plist>

现在我想使用PlistBuddy使其看起来像这样,使用字符串数组值(或其他所有值)添加CFBundleURLSchemes键:

<plist version="1.0">
<dict>
    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>urlname-1</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>urlscheme-1</string>
            </array>
        </dict>
    </array>
</dict>
</plist>

如何使用PlistBuddy实现这一目标?

假设CFBundleURLTypes的数组值为空: 通过执行/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:0:CFBundleURLName string 'urlname-1'" Info.plist,我可以将字典添加到数组中,包括它的第一个键/值对:

<plist version="1.0">
<dict>
    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>urlname-1</string>
        </dict>
    </array>
</dict>
</plist>

但我不知道如何将第二个密钥,例如CFBundleURLSchemes带有字符串数组值放入同一个字典中。

任何人都可以给我指针吗?这对PlistBuddy来说有可能吗?

3 个答案:

答案 0 :(得分:3)

不确定这是否是您期望的命令......

/usr/libexec/PlistBuddy -c "clear dict" -c "add :CFBundleURLTypes array" -c "add :CFBundleURLTypes:0 dict" -c "add :CFBundleURLTypes:0:CFBundleURLName string 'urlname-1'" -c "add :CFBundleURLTypes:0:CFBundleURLSchemes array" -c "add :CFBundleURLTypes:0:CFBundleURLSchemes:0 string urlscheme-1"  Info.plist

答案 1 :(得分:2)

可以添加,PlistBuddy很棘手但是一旦你得到,它就会很容易,你可以使用plistbuddy添加如下...

下面添加字典并设置键值对,听取"${10}"是plist的路径

/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:0:CFBundleURLName string urlname-1" "${10}"
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:0:CFBundleURLSchemes array" "${10}"
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:0:CFBundleURLSchemes:0 string aSchemeName" "${10}"

如果你想再添加一个字典,请加入

/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:1:CFBundleTypeRole string Viewer" "${10}"
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:1:CFBundleURLName string url_type_1" "${10}"
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:1:CFBundleURLSchemes array" "${10}"
/usr/libexec/PlistBuddy -c "Add :CFBundleURLTypes:1:CFBundleURLSchemes: string scheme_2" "${10}"

最后plist将如下所示

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>urlname-1</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>aSchemeName</string>
        </array>
    </dict>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Viewer</string>
        <key>CFBundleURLName</key>
        <string>url_type_1</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>scheme_2</string>
        </array>
    </dict>

您将获得more details here

答案 2 :(得分:0)

除非另有证明,否则我认为用plistbuddy无法实现我想要的目标。

我最终使用theano来修改我的plist,它确实有效:

C = T.cos
S = T.sin
q = T.fscalar(name="q%d"%self.i)

names = ['x','y','z']
Sx,Sy,Sz = map(lambda name: T.fscalar(name=name),names)

self.mat = np.array([[C(q),-S(q)*C(alpha),S(q)*S(alpha),a*C(q)+Sx],
                    [S(q),C(q)*C(alpha),-C(q)*S(alpha),a*S(q)+Sy],
                    [0,S(alpha),C(alpha),d+Sz],
                    [0,0,0,1]])