Ho provato il seguente codice per sostituire QQcon 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 QQcon 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 sedora cerca di sostituire ogni occorrenza del letterale $var1con 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 meverrà 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 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/
gun'opzione, quindi passeresti s,foo,bar,ginvece.
\\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.
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
/nella variabile => Questo mi ha salvato! La mia variabile è un URL e contiene /. Il passaggio all'utilizzo |come separatore ha risolto il mio problema