2012-06-21 17 views
21

Non riesco ad utilizzare una variabile in un comando sed, per esempio:Utilizzare una variabile in un comando sed

sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas 

voglio $ct_tname la variabile, non letteralmente $ct_tname, che è quello che continuo a ricevere .

Qualcuno sa come farlo funzionare?

Il problema è in realtà più complesso e ho omesso alcune informazioni.

ct_fname="%let outputfile="/user/ct_"$1".csv";" 

Qui, $1 è l'argomento passato nella all'inizio del mio script bash (sed viene eseguito all'interno di uno script bash).

Questo non viene eseguito correttamente, ma funziona se sostituisco ct_fname con

ct_fname="%let table=ct_$1;" 

C'è un modo per ottenere il primo ct_fname da passare con successo?

+0

possibile duplicato di [Come utilizzare una variabile script bash con sed] (http://stackoverflow.com/questions/3204302/how-to-use-a-bash-script-variable-with-sed) –

+0

possibile duplicazione di [sed scripting - sostituzione variabile d'ambiente] (http: // stackoverflow. it/questions/584894/sed-scripting-environment-variable-substitution) – tripleee

risposta

34

è necessario utilizzare le virgolette doppie (") anziché le virgolette singole ('). Le virgolette singole passano il loro contenuto letteralmente, senza tradurre le variabili (espansione).

provare

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas 

btw, se si sta andando ad essere la modifica di un file (cioè se file2.sas è un file temporaneo), si dovrebbe utilizzare ed invece.

+0

è spuntato così tante volte su SO che dovrebbe essere vietato di rispondere nuovamente: P Penso che S.O. dovrebbe evitare di pubblicare una domanda, se trova un argomento simile, beh, non prevenire, ma avverti prima di postare che una domanda simile è già stata risolta, e chiedi agli utenti di controllarla prima di procedere con la pubblicazione della domanda. – c00kiemon5ter

+0

In realtà, il mio problema è un po 'più complesso e non risolto semplicemente cambiando "a", la domanda modificata è sopra. Penso che il problema che sto affrontando sia piuttosto impegnativo e non la query comune che emerge su SO in merito. – user788171

1

È necessario utilizzare le virgolette doppie ("), con virgolette singole (') il valore della variabile non viene sostituito. Dal momento che si dispone di doppie virgolette nel testo sostitutivo, è necessario sfuggire loro: le variabili

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas 
1

Shell non vengono espansi all'interno apici. Prova questo:

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas 
1

Altre risposte si concentrano sull'uso delle doppie virgolette di escape nei loro esempi. Si noti che questo non è sempre quello che si vuole:

$ FOO="auie"; echo foo123bar|sed "s/123/\"$FOO\"/" 
foo"auie"bar 
$ FOO="auie"; echo foo123bar|sed "s/123/$FOO/" 
fooauiebar 
$ FOO="auie"; echo fooauiebar|sed "s/\"$FOO\"/123/" 
fooauiebar 
$ FOO="auie"; echo fooauiebar|sed "s/$FOO/123/" 
foo123bar 
3

Nel mio caso, ho appena remplaced virgolette singole da quelli matrimoniali:

for a in $(cat ext.cnf); do sed -n "/$a$/p" file1 >> file2; done 

Per ora, sta funzionando bene ...

0

Il problema è che quando $ct_fname è sostituito, sed vede aggiuntivi / separatori, quindi

sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas 

diventa

sed "24s/.*/"%let outputfile=/user/ct_ARGUMENT1.csv;"/" file1.sas > file2.sas 

e si otterrà un errore di sed perché ci sono 5 / invece dei previsti 3.

Invece, modificare le sed separatori ad un carattere non utilizzato come | o :, e sia virgolette singole o doppie funzionano bene:

sed '24s|.*|'$ct_tname'|' file1.sas > file2.sas 
sed "24s|.*|"$ct_tname"|" file1.sas > file2.sas 
Problemi correlati