2010-06-29 18 views
16

he intentado poner el siguiente en mi Makefile:Cómo usar sed en un 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 corro hacer, me sale el siguiente error:

sed: -e expression #1, char 30: unterminated `s' command 

Si yo ejecuta las líneas exactas que contienen sed en la consola, se comportan correctamente.

¿Por qué me sale este error y cómo puede solucionarse el problema?

+0

No hay un montón de sentido en el uso gato para canalizar la entrada ... ¿No podrías utilizar la entrada estándar redirección en el comando sed? –

+0

@ Platinum Azure: Sí, tal vez. Esta es solo una versión que alcancé al intentar soluciones al azar. – Tom

Respuesta

21

Podría ser el signo $ en la sustitución interpretado por make como una variable. Intente usar dos de ellos como . * $$ # public_demo. Entonces make ampliará eso a un solo $.

EDITAR: Esta fue solo la mitad de la respuesta. Como contestó cristis: la otra parte es que uno necesita usar comillas simples para evitar que bash expanda también el signo $.

6

le sugiero que utilice comillas simples en lugar de comillas dobles, la $ podría ser procesado como un char especial por marca antes de ejecutar sed:

cat sys.conf | sed -e 's#^public_demo[\s=].*$#public_demo=0#' >sys.conf.temp; 
+0

Utilicé comillas simples en primer lugar y cambié a comillas dobles porque yo también pensé que las comillas simples eran el problema. – Tom

+0

En realidad, creo que cristis es correcto, independientemente de si mi respuesta es correcta o no. $ se expandirá dos veces, creo: una vez en el archivo MAKE, por mi respuesta, y una vez por bash. El uso de comillas simples evitará que bash expanda $, pero no lo haga. –

+0

En realidad, usted tenía AMBAS razón. El uso de comillas simples y $$ solucionó el problema. ¿De quién es la respuesta que acepto ahora? – Tom

0

uso algo más que # para separar las partes.

+0

Utilicé/en primer lugar y cambié a # porque yo también pensé que el separador era el problema. – Tom

3

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 añadir barra invertida para $ para prevenir sed tomarlo como final de línea:

cat sys.conf | sed -e 's#^public_demo[\s=].*\$$#public_demo=0#' >sys.conf.temp 
0

un problema que tuve al usar sed en las respuestas actuales no abordan un archivo MAKE, por lo que lo explicaré aquí. Estaba poblando las variables de Bash como así: remote_owner=$$($(MAKE) remote.owner) y luego usando esas variables en mi sustitución sed. problema es que, debido a la forma enrevesada mis reglas se establecen, remote_owner podría tener propia salida de maquillaje en ella, y me da el error:

sed: -e expression #1, char 69: unknown option to `s' 
make: *** [alter_table_local.sql] Error 1 

por ejemplo, mediante la adición de mensajes de depuración, encontré local_owner puse a:

make[1]: Entering directory `/home/jcomeau/rentacoder/jh' 
jcomeau 

la respuesta fue la de añadir la opción de hacer --silent: remote_owner=$$($(MAKE) --silent remote.owner)

0

probé signo doble $$ pero no funcionaba en mi problema, tal vez $$$$ o $$$$$$$$ habría funcionado, porque mi Makefile llama a otros Makefiles y así sucesivamente. Pero encontré una solución mejor:

Cree un archivo de shell replacer.sh en la misma carpeta que su archivo Makefile que ejecuta el comando sed.Darle bit de ejecución con

chmod +x replacer.sh 

ya se puede llamar a este archivo en su Makefile:

./replacer.sh 
Cuestiones relacionadas