【发布时间】:2011-03-14 14:11:38
【问题描述】:
为了建立一个持续集成系统,Hudson,我编写了一个 bash 脚本来自动构建 Xcode 项目。 此外,在 Debug 配置中,有人要求我在 PROJECT-Info.plist 文件的 CFBundleRevision 字段中插入项目的 svn 修订号作为 ${BUNDLE_VERSION}.r${SVN_REVISION}。
您可以在下面找到 PROJECT-Info.plist 文件的源代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
[...]
<key>CFBundleVersion</key>
<string>1.0</string>
[...]
</dict>
</plist>
我在下面尝试了这个 bash 脚本:
sed 'N;s_^.*<key>CFBundleVersion</key>.*<string>[0-9][0-9]*\.[0-9][0-9]*</string>$_<key>CFBundleVersion</key>\
<string>'"$BUNDLE_VERSION"'\.r'"$SVN_REVISION"'</string>_' $PROJECT-Info.plist
此脚本应将“1.0”字符串替换为 ${BUNDLE_VERSION}.r${SVN_REVISION}(目前仅在标准输出中)。
但是,在没有 'N' 选项的情况下替换工作,该选项包括 sed 进程中的下一行并且一次一行。但是 PROJECT-Info.plist 文件中有很多行带有“<string>[...]</string>”字符串...
我认为这是我处理两行之间未知字符的方式('N' 选项和任何字符的“.*”)是错误的。
有什么想法吗?
在此先感谢,并为我的英语水平不佳感到抱歉。
【问题讨论】:
-
您需要使用适当的 XML 工具,例如为操作 XML 文件中的键和值而设计的 Python 或 Perl 模块。还有可用的 shell 实用程序,例如 xmlstarlet。 Regexes are not up to the challenge。顺便说一句,你的英语几乎是完美的。
-
感谢您提供xmlstarlet shell 实用程序解决方案。我下载并安装了它。我明天会测试它,我会给你我的反馈。
标签: bash edit info.plist