makefile - nanorc - pinturas nano colors
Cómo usar sed en un makefile (6)
He intentado poner lo siguiente en mi Makefile:
@if [ $(DEMO) -eq 0 ]; then /
cat sys.conf | sed -e "s#^public_demo[/s=].*$#public_demo=0#" >sys.conf.temp; /
else /
cat sys.conf | sed -e "s#^public_demo[/s=].*$#public_demo=1#" >sys.conf.temp; /
fi
pero cuando ejecuto make , me sale el siguiente error:
sed: -e expression #1, char 30: unterminated `s'' command
Si ejecuto las líneas exactas que contienen sed
en la consola, se comportan correctamente.
¿Por qué recibo este error y cómo se puede solucionar el problema?
Intenté el signo doble $$
pero no funcionó en mi problema, tal vez $$$$
o $$$$$$$$
habría funcionado, porque mi Makefile llama a otros Makefiles y así sucesivamente. Pero encontré una mejor solución:
Cree un archivo de shell replacer.sh
en la misma carpeta que su Makefile que ejecuta el comando sed
. Dale bit ejecutable con
chmod +x replacer.sh
Ahora puedes llamar a este archivo en tu Makefile:
./replacer.sh
La versión make
en mi máquina es:
$ make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for x86_64-redhat-linux-gnu
Y la versión sed
:
$ sed --version
GNU sed version 4.2.1
Debo agregar barra invertida por $
para evitar que lo tome como final de línea:
cat sys.conf | sed -e ''s#^public_demo[/s=].*/$$#public_demo=0#'' >sys.conf.temp
Le sugiero que use comillas simples en lugar de comillas dobles, el $
podría procesarse como un carácter especial por marca antes de ejecutar sed:
cat sys.conf | sed -e ''s#^public_demo[/s=].*$#public_demo=0#'' >sys.conf.temp;
Puede ser el signo $ en la sustitución que se interpreta por hacer como una variable. Intenta usar dos de ellos como . * $$ # public_demo . Entonces make lo expandirá a un solo $.
EDIT: Esto fue sólo la mitad de la respuesta. Como respondió cristis: la otra parte es que uno necesita usar comillas simples para evitar que bash también expanda el signo $.
Un problema que tuve con el uso de sed en un makefile no se aborda con las respuestas actuales, así que lo explicaré aquí. Estaba poblando las variables de Bash así: remote_owner=$$($(MAKE) remote.owner)
y luego remote_owner=$$($(MAKE) remote.owner)
esas variables en mi sustitución sed. El problema es que, debido a la forma complicada en que están configuradas mis reglas, remote_owner
podría tener una salida propia de make, dándome el error:
sed: -e expression #1, char 69: unknown option to `s''
make: *** [alter_table_local.sql] Error 1
por ejemplo, al agregar mensajes de depuración, encontré local_owner configurado en:
make[1]: Entering directory `/home/jcomeau/rentacoder/jh''
jcomeau
la respuesta fue agregar la opción --silent
para hacer: remote_owner=$$($(MAKE) --silent remote.owner)
Use algo más que #
para separar las partes.