2009-07-24 3 views
11

Was Ich mag würde, ist, etwas zu tun wie folgt aus:Wie verwenden Sie Shell-Skriptvariablen als Argumente für sed?

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

somecommand | sed "$EMAIL" 

Aber ich folgendes:

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

Ich habe versucht, viele Variationen. Ich weiß, dass es nur darum geht, die Zeichenfolge richtig zu zitieren. Der Grund, warum ich das tun möchte, besteht darin, einen langen sed-Befehl zur besseren Lesbarkeit zu unterbrechen. Soll ich stattdessen eine sed-Skriptdatei (mit der Option -f) verwenden?

UPDATE:

Meine eigentliche Skript ist ein wenig komplexer:

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

somecommand | sed "$EMAIL" 

Nachdem die einfachen Anführungszeichen zu entfernen, erhalte ich:

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

Antwort

16

Für diese Art des Zitierens Problem ist eval fast immer Lösung.

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

echo SOMETHING | eval sed "$SED_ARG" 

Was passiert ist, dass in Ihrer Version wird die Schale mit einem Argument sed aufzurufen (die Zeichenfolge „-e‚s/ETWAS // g‘“), aber Sie wollen sed mit zwei Argumenten aufgerufen werden ("-e" und "'s/SOMETHING // g'"). Eval bewirkt, dass die Shell die Zeichenfolge so interpretiert, wie Sie es möchten.

0

Entfernen Sie die Apostrophe aus dem Wert von EMAIL.

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

die einfachen Anführungszeichen entfernen und es sollte gut

0

Das ist für mich gearbeitet (Surround mit doppelten Anführungszeichen):

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

Das liegt daran, dass Sie etwas völlig anderes machen. – Swoogan