2011-10-04 67 views
12

我是shell腳本編程新手,但得到這個錯誤並且無法弄清楚發生了什麼。獲取sed錯誤

sed: 1: "/Users/local/Do ...": extra characters at the end of d command 
sed: 1: "/Users/local/Do ...": extra characters at the end of d command 
sed: 1: "/Users/local/Do ...": extra characters at the end of d command 
sed: 1: "/Users/local/Do ...": extra characters at the end of d command 

這是我跑

for fl in $(S_convertPath ${RESOURCE_DIR}/db)/db.changelog-*xml; do 
    sed -i "s/HOSTNAME/${IP_ADDRESS}/g" $fl 
done 

感謝

腳本

回答

43

鑑於sed似乎認爲你正在運行一個delete line命令(d),你可能要輸出的命令查看您的環境變量:

for fl in $(S_convertPath ${RESOURCE_DIR}/db)/db.changelog-*xml; do 
    echo sed -i "s/HOSTNAME/${PSM_SERVER_ADDRESS}/g" $fl 
done 

PSM_SERVER_ADDRESS很有可能會損壞您的sed命令(並且可能需要進行處理才能使其清潔)。一種方式做到這一點(前提是你要有足夠新sed)是使用沒有出現在環境變量的分隔符,例如:

sed -i "s?HOSTNAME?${PSM_SERVER_ADDRESS}?g" $fl 

既然你已經接受了這個答案,我也可以爲您發現的其他問題添加分辨率。看起來BSD sed與Linux不同,它有一個要求,您提供了對-i選項的擴展。因此,儘管Linux允許:

sed -i "sed-command" 

就地編輯時,BSD變體都需要有:

sed -i "" "sed-command" 

一個空的備份文件的後綴。

沒有這些,sed可能會使用您的命令作爲擴展名,並將您的第一個文件名作爲命令。

+2

是的。值'PSM_SERVER_ADDRESS'是一個路徑(它包含'/'字符),因此s命令將這些'/'字符解釋爲分隔符(例如's/HOSTNAME // Users/davidkavanagh/path/g')。應該使用分隔符,也許是@ HOSTNAME @ $ {PSM_SERVER_ADDRESS}/g'。 – jamessan

+0

IP_ADDRESS等於一個函數,它使用主機名-i在所有平臺上使用ip獲取ip – daverocks

+0

@daverocks,你需要運行修改後的腳本我提供了讓迴應的行,即使你做出的改變。這是唯一的方法來知道給'sed'的命令是。 – paxdiablo