Come uso le variabili in un comando sed?


Risposte:


358

La shell è responsabile dell'espansione delle variabili. Quando usi virgolette singole per le stringhe, i suoi contenuti verranno trattati letteralmente, quindi sedora cerca di sostituire ogni occorrenza del letterale $var1con ZZ.

Usando le virgolette doppie

Usa le virgolette doppie per far espandere le variabili alla shell preservando gli spazi bianchi:

sed -i "s/$var1/ZZ/g" "$file"

Quando si richiede il carattere di virgolette nella stringa di sostituzione, è necessario precederlo con una barra rovesciata che verrà interpretata dalla shell. Nel seguente esempio, la stringa quote meverrà sostituita da "quote me"(il carattere &viene interpretato da sed):

sed -i "s/quote me/\"&\"/" "$file"

Utilizzando virgolette singole

Se hai molti meta-caratteri shell, considera l'utilizzo di virgolette singole per il modello e virgolette doppie per la variabile:

sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"

Notate come uso s,pattern,replacement,invece di s/pattern/replacement/, l'ho fatto per evitare interferenze con /in \0/.

Esempio

La shell esegue quindi il comando precedente sedcon gli argomenti successivi (assumendo pattern=berte file=text.txt):

-i
s,bert,Say hurrah to &: \0/,
text.txt

Se file.txtcontiene bert, l'output sarà:

Say hurrah to bert: \0/

2
Come si passa l'opzione "/ g" usando questo modulo separato da virgola?
blong

6
@ b.long È gun'opzione, quindi passeresti s,foo,bar,ginvece.
Lekensteyn,

1
il tuo esempio di citazione singola è particolarmente utile, copre sed usando il modello regex abbastanza bene!
Brian Thomas,

Nel caso in cui sei tentato di utilizzare \\0invece di \0, non dovrebbe essere fatto quando \0è racchiuso tra virgolette singole. Altrimenti sedsostituirà il modello con un valore letterale \0anziché con l'intera corrispondenza.
Lekensteyn,

Ha fatto il trucco per me.
jimh

114

Possiamo usare le variabili sedusando virgolette doppie:

sed -i "s/$var/r_str/g" file_name

Se hai una barra /nella variabile, usa un separatore diverso, come di seguito:

sed -i "s|$var|r_str|g" file_name

7
Se hai una barra /nella variabile => Questo mi ha salvato! La mia variabile è un URL e contiene /. Il passaggio all'utilizzo |come separatore ha risolto il mio problema
sonlexqt,

Pollice su per "se hai una barra nella variabile"
Tiina
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.