2011-10-04 69 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