Ho provato il seguente codice per sostituire QQ
con ZZ
, ma non fare quello che voglio:
var1=QQ
sed -i 's/$var1/ZZ/g' $file
Tuttavia, questo codice fa quello che voglio:
sed -i 's/QQ/ZZ/g' $file
Come uso le variabili in sed
?
Ho provato il seguente codice per sostituire QQ
con ZZ
, ma non fare quello che voglio:
var1=QQ
sed -i 's/$var1/ZZ/g' $file
Tuttavia, questo codice fa quello che voglio:
sed -i 's/QQ/ZZ/g' $file
Come uso le variabili in sed
?
Risposte:
La shell è responsabile dell'espansione delle variabili. Quando usi virgolette singole per le stringhe, i suoi contenuti verranno trattati letteralmente, quindi sed
ora cerca di sostituire ogni occorrenza del letterale $var1
con ZZ
.
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 me
verrà sostituita da "quote me"
(il carattere &
viene interpretato da sed
):
sed -i "s/quote me/\"&\"/" "$file"
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/
.
La shell esegue quindi il comando precedente sed
con gli argomenti successivi (assumendo pattern=bert
e file=text.txt
):
-i
s,bert,Say hurrah to &: \0/,
text.txt
Se file.txt
contiene bert
, l'output sarà:
Say hurrah to bert: \0/
g
un'opzione, quindi passeresti s,foo,bar,g
invece.
\\0
invece di \0
, non dovrebbe essere fatto quando \0
è racchiuso tra virgolette singole. Altrimenti sed
sostituirà il modello con un valore letterale \0
anziché con l'intera corrispondenza.
Possiamo usare le variabili sed
usando 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
/
nella variabile => Questo mi ha salvato! La mia variabile è un URL e contiene /
. Il passaggio all'utilizzo |
come separatore ha risolto il mio problema