2013-11-26 96 views
2

我希望通過一個文件來使用bash循環,把所有的佔位符varialbes成真正的變量:通過文件桑達循環和替換佔位符變量

  • $ PLACEHOLDER_USER - > $ USER
  • $ PLACEHOLDER_STATE - > $ STATE

它需要與任何以佔位符開頭的變量一起工作,並將其變成其實變量。這是我的代碼至今:

$FILE="/mytest.conf" 
sed -i "s/$var1/$var2/g" "$FILE" 

但是我不知道我怎麼撐過整個文件循環,我不知道我怎樣才能與以$開頭的變量使它PLACEHOLDER_

任何幫助,將不勝感激。

+0

你能提供一個'mytest.conf'及其預期輸出的樣本。 – anubhava

回答

2

sed的默認操作是讀取和打印輸入文件的每一行。您可以通過編寫sed腳本以各種方式修改此行爲。一個典型的腳本就像

sed -i "s/\\\$PLACEHOLDER_USER/$USER/g;s/\\\$PLACEHOLDER_STATE/$STATE/g" file 

請注意這裏的引用;雙引號允許shell用環境中的值替換$USER$STATE,而反斜槓的美元符號不會被替換。因此,外殼進行了一些換人,並通過sed實際運行時間,劇本已經成爲

sed -i 's/\$PLACEHOLDER_USER/fred/g;s/\$PLACEHOLDER_STATE/Arkansas/g' file 

(我提供此單引號強調的是,沒有進一步的替換將發生。)

在更一般情況下,sed無法訪問您的環境變量,但可以編寫一個shell腳本,該腳本可以從變量生成sed腳本。

env | sed 's%^\([^=]*\)=\(.*\)%s/\\\$PLACEHOLDER_\1/\2/g%' | sed -f - file 

這有點棘手。第一個sed腳本的輸出是另一個sed腳本,由sed -f -由另一個sed實例讀取。 (這在所有平臺上都不支持,但至少應該在Linux上工作,如果您的系統不支持此功能,可以通過將腳本寫入臨時文件或使用命令替換來解決此問題。)

env列出你的環境變量。第一個sed腳本將在每個變量名稱前加上\$PLACEHOLDER_,並生成sed的片段,以便用環境中的值替換它的任何出現。 (注意:如果值包含正則表達式元字符,則需要一個更復雜的腳本,如果值可以包含斜線,則需要用另一個分隔符替換斜線分隔符;可以使用任何您喜歡的ASCII字符。)

+1

謝謝你,這正是我需要的!如果你想輸出到一個不同的文件,你可以省略'-i'選項,並添加'> output.conf'來將sed​​的輸出重定向到文件。同樣重要的是要注意,在Mac OS X上執行此操作時,您需要使用'-i「」'而不是'-i'來進行編輯,因爲Mac OS X派生自BSD並使用sed的BSD風格。 –