需要使用字符串/变量进行修补

时间:2010-07-31 16:00:19

标签: bash scripting patch

我正在编写一个脚本来自动化在计算机实验室中设置一堆Mac的过程。

每个系统都是唯一标识的,我需要一种在多个位置修补plist文件的方法,该文件具有相同的字符串,该字符串将在脚本中从用户读取,这是一个bash脚本

原始字符串始终相同。修补字符串是可变的,具体取决于运行脚本的系统的标识。为了各种其他目的,在脚本开头从用户读取该字符串,并存储在$ macnum中。

有人可以为我提供一个简单的解决方案,可以编写脚本来执行任务吗?感谢。

3 个答案:

答案 0 :(得分:2)

您可以在plist中使用一些唯一标识符(例如{{MACHINE_ID}})并使用sed替换它:

sed -i -e 's/{{MACHINE_ID}}/'"$macnum"/g filename

答案 1 :(得分:1)

sed -i "s/plist-macnum-placeholder/$macnum/g' file ...

其中-i表示“就地”编辑文件,而/g表示每行进行多次替换,如果只有一行则可以删除。

答案 2 :(得分:0)

基于sed的方法strager和msw给出的工作正常如果你正在改变的plist是XML格式,但如果它是Apple的二进制格式,它可能会破坏文件格式。您可以先使用plutil将其转换为XML:

plutil -convert xml1 filename
sed -i -e "s/placeholder/$macnum/g" filename

之后,没有必要将其转换回二进制格式,因为Apple的plist框架可以互换地读取这两种格式。另一种方法是使用PlistBuddy来编辑plist的内容(尽管它需要脚本知道要设置哪些条目的值,而不是仅仅替换占位符):

/usr/libexec/PlistBuddy -c "set :oneentry 'value including $macnum where appropriate'" filename
/usr/libexec/PlistBuddy -c "set :anotherentry 'value including $macnum where appropriate'" filename

最后,您可以使用默认值执行相同的操作,但它要求您按完整路径指定.plist文件,并将.plist保留为其名称:

defaults write oneentry "value including $macnum where appropriate" /path/to/filename-without-plist
defaults write anotherentry "value including $macnum where appropriate" /path/to/filename-without-plist