2010-07-31 38 views
1

我正在編寫一個腳本來自動化在計算機實驗室中設置一堆Mac的過程。需要使用字符串/變量補丁

每個系統唯一標識,我需要在相同的字符串的多個位置,將來自用戶腳本這是一個bash腳本

原始字符串讀取貼敷plist文件的方法總是一樣的。修補字符串根據運行腳本的系統標識而變化。該字符串是在腳本開始時從用戶處讀取的,用於各種其他目的,並存儲在$ macnum中。

任何人都可以請我提供一個簡單的解決方案,可以腳本來執行任務嗎?謝謝。

回答

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

-i手段編輯「就地」的文件,並/g說使每行多次替換,如果只有一個,可以丟棄。

+0

我選擇這個答案作爲答案,因爲它解釋了選項/參數的含義,我不是盲目追隨解決方案的人,我喜歡能夠向他們學習,所以我可以在將來應用它們。有關s /的更多解釋也很好。謝謝。 – Hamid 2010-08-05 16:28:22

+0

感謝您的接受,但StackOverflow是閱讀手冊的可靠替代品。例如,知道sed的存在可以讓你制定出其他問題。 http://developer.apple.com/internet/opensource/opensourcescripting.html – msw 2010-08-05 16:51:09

2

可以在plist中使用的一些唯一標識符(例如{{MACHINE_ID}}),並使用sed來替代它:

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

這給出了一個錯誤信息:「sed的:-e表達式#1 ,字符21:前面的正則表達式無效「。嘗試:'sed -i「s/{{MACHINE_ID}}/$ macnum/g」文件名「 – 2010-07-31 17:47:13

+0

@丹尼斯威廉姆森,你是對的;對於那個很抱歉。我經常感到困惑,因爲我每天都在不同的正則表達式之間切換。 – strager 2010-07-31 18:07:38

+0

謝謝你們,我會試一試,一旦發生變化,並讓你知道它是如何發生的。這會替換文檔中MACHINE_ID的所有發生嗎? – Hamid 2010-08-01 16:03:06

0

基於sed的方法strager和msw給出的將會正常工作如果您正在更改的plist是XML格式,但是如果它是Apple的二進制格式,它可能會破壞文件格式。您可以使用plutil首先將它轉換爲XML:

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

它不應該是必要將其轉換爲二進制格式後,蘋果公司的框架的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 
+0

對不起,我忘了提及它是在標準的XML中,因爲我只是想自動化我已經做出的改變。 – Hamid 2010-08-05 16:27:01