2009-07-24 16 views
11

Quello che vorrei fare è qualcosa di simile al seguente:Come si usano le variabili di script della shell come argomenti su sed?

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

somecommand | sed "$EMAIL" 

ma ottengo il seguente:

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

ho provato molte varianti. So che è solo questione di far quotare la stringa giusta. La ragione per cui mi piacerebbe farlo è di rompere un lungo comando per la leggibilità. Dovrei semplicemente usare un file script sed (con l'opzione -f)?

UPDATE:

Il mio script reale è un po 'più complessa:

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

somecommand | sed "$EMAIL" 

Dopo aver rimosso le virgolette singole ottengo:

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

risposta

16

Per questo tipo di citare problema, eval è quasi sempre il soluzione.

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

echo SOMETHING | eval sed "$SED_ARG" 

Quello che sta succedendo è che nella vostra versione, la shell invoca sed con un argomento (la stringa " '/ QUALCOSA s // g' -e"), ma si desidera sed ad essere invocate con due argomenti ("-e" e "/ SOMETHING // g '"). Eval fa in modo che la shell interpreti la stringa nel modo desiderato.

0

Rimuovere le virgolette singole dal valore di EMAIL.

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

rimuovere le virgolette singole e dovrebbe funzionare bene

9

Passing arguments into a sed script spettacoli con un esempio di scrittura grep.

#!/bin/sh 
#File: sedgrep 
sed -n 's/'"$1"'/&/p' 

grep può essere fatto come,

sedgrep '[A-Z][A-Z]' <file 
0

Questo ha funzionato per me (surround con le doppie virgolette):

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

Questo perché stai facendo qualcosa di completamente diverso. – Swoogan

Problemi correlati