2009-07-24 9 views
11

Lo que me gustaría hacer es algo como lo siguiente:¿Cómo se usan las variables de script de shell como argumentos para sed?

#!/bin/sh 
EMAIL="-e 's/SOMETHING//g'" 

somecommand | sed "$EMAIL" 

pero me sale el siguiente:

sed: -e expression #1, char 2: unknown command: `'' 

que he intentado muchas variaciones. Sé que solo se trata de hacer que la secuencia de las cuerdas sea correcta. La razón por la que me gustaría hacer esto es romper un largo comando de sed para facilitar la lectura. ¿Debería usar un script script sed (con la opción -f) en su lugar?

ACTUALIZACIÓN:

Mi script real es un poco más complejo:

#!/bin/sh 
EMAIL="-e s/SOME THING//g -e s/SOME THING ELSE//g ..." 

somecommand | sed "$EMAIL" 

Después de quitar las comillas simples me sale:

sed: -e expression #1, char 18: unknown option to `s' 

Respuesta

16

Para este tipo de citar problema, eval es casi siempre el solución.

 
#!/bin/sh 
SED_ARG="-e 's/SOMETHING//g'" 

echo SOMETHING | eval sed "$SED_ARG" 

Lo que pasa es que en su versión, la cáscara está invocando sed con un argumento (la cadena "-e 's/g // ALGO'"), pero desea SED que se invoca con dos argumentos ("-e" y "'s/ALGO // g'"). Eval hace que el intérprete interprete la cadena de la manera que desee.

0

Retire las comillas simples del valor de EMAIL.

EMAIL="-e s/SOMETHING//g" 
0

quitar las comillas simples y debería funcionar bien muestra

0

Esto funcionó para mí (envolvente con comillas dobles):

env | sed -n /"$USERNAME"/p 
+2

Eso es porque estás haciendo algo completamente diferente. – Swoogan

Cuestiones relacionadas