为了实现持续集成系统Hudson,我编写了一个bash脚本来自动构建Xcode项目。 此外,在调试配置中,有人问我是否将项目的svn修订版号插入PROJECT-Info.plist文件的CFBundleRevision字段中,作为$ {BUNDLE_VERSION} .r $ {SVN_REVISION}。Bash脚本编辑PROJECT-Info.plist文件的CFBundleVersion字段
你会发现下面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。 [正则表达式不符合挑战](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)。顺便说一下,你的英语非常接近完美。 – 2011-03-14 15:31:58
感谢您使用[xmlstarlet](http://xmlstar.sourceforge.net/)shell实用程序解决方案。我下载并安装了它。我明天会测试它,我会给你我的反馈。 – 2011-03-14 17:58:43