爲了實現持續集成系統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