替换 .plist 文件中的行以修改 <string> - 可以吗?

Posted

技术标签:

【中文标题】替换 .plist 文件中的行以修改 <string> - 可以吗?【英文标题】:Replace line in .plist file to modify <string> - is it possible? 【发布时间】:2012-09-22 00:30:03 【问题描述】:

基本上我想知道是否可以创建一个脚本来编辑 .plist 文件中的条目。但是我不想替换特定的字符串,而是整行,因此可以添加新字符串,因为属性会不断变化。一个例子:

<string>Something</string>
<key>SomethingElse</key>
<string>Numbers</string>
<key>Entry</key>

并且将第三行更改为类似于以下内容,无论该行当前说什么。

<string>randomstuffhere</string>

我一直在寻找几个小时,我认为使用 sed 可能是可能的,但在查看示例之后,我似乎无法破译它来自己构建它。任何和所有的帮助表示赞赏。哦,如果可能的话,我想避免使用 perl。

编辑:使用以下内容时,在终端窗口中进行了更改,但似乎没有将其保存到文件中。使用 -i 显然是解决这个问题的方法,但它会给我一个错误,所以我不确定我做错了什么。

sed -n '/SomethingElse/p;n;s/>.*</>randomstuffhere</;;p' my.plist

【问题讨论】:

【参考方案1】:

使用defaults 编辑它可能是最简单的:

defaults write /abs/path/to/plist SomethingElse "randomstuffhere"

请注意,您必须提供 plist 文件的绝对路径,并在其文件名中保留“.plist”。

另外(如 cmets 中所指出的)这倾向于将 plist 文件转换为二进制 plist 格式变体;使用适当的 .plist 阅读框架的程序可以很好地阅读,但它不再是人类可读的。如果您希望它是 XML 格式的变体,您可以使用 plutil -convert xml1 /path/to/plist.plist 进行转换。

或者,您可以使用PlistBuddy 代替defaults

/usr/libexec/PlistBuddy -c "Set :SomethingElse 'randomstuffhere'" /path/to/plist.plist

【讨论】:

我也想过这个问题,但是当我执行上面显示的操作时,它似乎破坏了文件,当我查看文件时它变成了一堆乱七八糟的字符 defaults 习惯性地将 .plist 文件转换为二进制格式,这看起来很奇怪,但应该可以正常工作。如果您愿意,您可以使用 plutil -convert xml1 /path/to/plist.plist 将其转换回来,或者您可以使用 PlistBuddy 代替,因为它不会像转换为二进制一样痴迷:/usr/libexec/PlistBuddy -c "Set : SomethingElse 'randomstuffhere'" /path/to/plist.plist 啊,默认设置确实可以正常工作。当我尝试 PlistBuddy 方法时,我得到“无法在容器上执行设置”。 我不知何故在 PlistBuddy 命令中有一个杂散空间;应该是/usr/libexec/PlistBuddy -c "Set :SomethingElse 'randomstuffhere'" /path/to/plist.plist @GordonDavisson 在您的帮助下,这个 PlistBuddy 技术可以帮助我为使用 WebKit 小部件的 Cocoa 应用程序创建一个防篡改 html 文件夹。我可以生成一个加盐的 SHA512 哈希,在编译时使用更新 Info.plist 的编译脚本将其存储,然后在应用程序启动时生成并比较哈希。效果很好!【参考方案2】:

所以这是您要更改的第三行?

 sed -i"" '3;s\:.*:<string>randomstuffhere</string>:;' .plist

我认为 osx sed 支持 -i 选项,但你必须告诉它不要使用备份扩展来覆盖它。一些 sed 要求 s/// 的初始字符(如果不是“/”)应该被转义,即 \:。你可能只需要:

在冒文件内容的风险之前,我会将其测试为sed '3....' file &gt; newFile。要测试-i"",请制作一份副本。

如果您希望始终更改其中包含数字的行,请使用

sed -i"" '\:<string>Numbers.*$:/<string>randomstuffhere</string>:` .plist

IHTH。

【讨论】:

这会返回“sed: -i may not be used with stdin”。有其他选择吗? 您如何使用sed -i,如我的回答所示?试试man sed 看看他们是否有在osx 上正确使用sed -i 的说明。否则,请使用sed '3...' file &gt; newFile &amp;&amp; mv newFile file。祝你好运。 我用 sed -i 正如你解释的那样,是的。它只是在 osx 上似乎没有以同样的方式运行。

以上是关于替换 .plist 文件中的行以修改 <string> - 可以吗?的主要内容,如果未能解决你的问题,请参考以下文章

[使用PHP替换xml / plist文件中的字符串

如何匹配 Notepad++ 中的整行以进行搜索/替换?

是否可以在不替换的情况下以编程方式修改/更新 plist 文件?

如何迭代数据框中的行以检测不同的单词并将其保存在新列中?

排列数组中的行以消除增加的子序列

获取 Microsoft Access 中的行以引用其他行