non-GNU sed

Sep. 3rd, 2009 11:52 am
redtigra: (Default)
[personal profile] redtigra
Пишу себе на память, потому что сколько-то времени потратила. Имеем 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-у

March 2022

S M T W T F S
  12345
678910 1112
1314 15 16171819
202122 23242526
27 28293031  

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 14th, 2025 11:59 am
Powered by Dreamwidth Studios