Пишу себе на память, потому что сколько-то времени потратила. Имеем bash и неГНУщийся sed.
1. Нужно:
sed -e "s/SUBST_HOMEDIR/$HOMEDIR/g" filename
при этом $HOMEDIR а) генерируется динамически, то есть прописать значение жестко нельзя, и b) имеет вид типа /foo/bar/get/out, то есть содержит слэши - "/" - от которых sed теряет ориентацию. То есть надо экранировать слэши.
Решение:
HOMEDIR=`echo $HOMEDIR | sed 's,/,\\\\\/,g'`
sed -e "s/SUBST_HOMEDIR/$HOMEDIR/g" filename
2. Та же проблема, но с генерируемым IP, который, зараза, содержит точки, решилась проще. Экранируем точки:
HOST_IP=`echo "$HOST_IP" | sed 's/\./\\./g'`
3. Ну и наконец - оооо - замена только первого совпадения в файле при том, что sed is non-GNU:
sed -e '/RE/{s//to_that/;:a' -e '$!N;$!ba' -e '}' file #замена первого вхождения RE на to_that
Для сравнения - так это выглядит в GNU-sed:
sed '1,/RE/s//to_that/' file
Aх да, еще вот -
хороший faq по sed-у