non-GNU sed
Sep. 3rd, 2009 11:52 amПишу себе на память, потому что сколько-то времени потратила. Имеем 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-у
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-у
no subject
Date: 2009-09-03 09:54 am (UTC)sed "s|match|repl|g"
no subject
Date: 2009-09-03 09:57 am (UTC)(2)s/pattern/replacement/flags
Substitutes the replacement string for the first occurrence of the pattern parameter in the pattern space. Any character that is displayed
after the s subcommand can substitute for the / (slash) separator except for the space or new-line character.
Так что, похоже, замена сепаратора - тоже привилегия гну, как и масса других хороших вещей. Но я, кстати, полагаю, что слеши в подстановке придется экранировать все равно, это же regexp.
no subject
Date: 2009-09-03 10:01 am (UTC)no subject
Date: 2009-09-03 10:09 am (UTC)no subject
Date: 2009-09-03 10:11 am (UTC)no subject
Date: 2009-09-03 10:13 am (UTC)no subject
Date: 2009-09-08 09:18 am (UTC)no subject
Date: 2009-09-08 04:28 pm (UTC)было время золотое. но у меня на них рута нету :)
no subject
Date: 2009-09-03 10:14 am (UTC)no subject
Date: 2009-09-03 10:20 am (UTC)no subject
Date: 2009-09-03 01:31 pm (UTC)no subject
Date: 2009-09-03 01:51 pm (UTC)не стоит, потому что весь остальной инструментарий - а его много - на bash, и смешивать не хочется. Кроме того, скрипт унаследует дядька (я завтра уеду) - ORACLE-бог, но со скриптовымы языками на вы и с перлом не очень общается, а все обвязки предпочитает на ksh или вообше, господи помоги, пишет sql-скриптики, ему так удобней.
Словом, написать можно, но по ряду причин в данном конкретном случае не стоит.
no subject
Date: 2009-09-03 03:17 pm (UTC)no subject
Date: 2009-09-04 07:38 am (UTC)no subject
Date: 2009-09-04 07:40 am (UTC)no subject
Date: 2009-09-04 07:52 am (UTC)no subject
Date: 2009-09-03 05:24 pm (UTC)no subject
Date: 2009-09-04 04:50 am (UTC)