替换 .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 > 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 > newFile && mv newFile file
。祝你好运。
我用 sed -i 正如你解释的那样,是的。它只是在 osx 上似乎没有以同样的方式运行。以上是关于替换 .plist 文件中的行以修改 <string> - 可以吗?的主要内容,如果未能解决你的问题,请参考以下文章