2009-07-24 5 views
11

Ce que je voudrais faire est quelque chose comme ce qui suit:Comment utilisez-vous les variables de script shell comme arguments pour sed?

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

somecommand | sed "$EMAIL" 

Mais j'obtiens ce qui suit:

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

J'ai essayé beaucoup de variations. Je sais que c'est juste une question de chaîne. La raison pour laquelle je voudrais faire cela est de casser une longue commande sed pour la lisibilité. Devrais-je simplement utiliser un fichier script sed (avec l'option -f) à la place?

MISE À JOUR:

Mon script actuel est un peu plus complexe:

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

somecommand | sed "$EMAIL" 

Après avoir enlevé les guillemets simples je reçois:

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

Répondre

16

Pour ce type de problème cité, eval est presque toujours la Solution.

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

echo SOMETHING | eval sed "$SED_ARG" 

Qu'est-ce qui se passe est que dans votre version, le shell invoque sed avec un argument (la chaîne « -e « s/CHOSE // g » »), mais vous voulez sed être invoqué avec deux arguments ("-e" et "'s/QUELQUE CHOSE // g'"). Eval force le shell à interpréter la chaîne comme vous le souhaitez.

0

Retirez les guillemets simples de la valeur de EMAIL.

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

enlever les guillemets simples et il devrait fonctionner parfaitement

0

Cela a fonctionné pour moi (surround avec des guillemets doubles):

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

C'est parce que vous faites quelque chose de complètement différent. – Swoogan

Questions connexes