5

基本上我想知道是否可以创建一个脚本来编辑 .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
4

2 回答 2

5

使用它可能最容易defaults编辑它:

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

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

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

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

/usr/libexec/PlistBuddy -c "Set :SomethingElse 'randomstuffhere'" /path/to/plist.plist
于 2012-09-22T00:49:25.190 回答
0

所以这是你要改变的第三行?

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

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

我会像sed '3{....}' file > newFile以前一样测试这个文件的内容。并进行测试-i"",制作副本。

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

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

IHTH。

于 2012-09-22T00:36:45.143 回答