Come si usano le variabili in un comando sed?

196

Ho provato il seguente codice per sostituire QQ con ZZ , ma non fa 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 faccio a utilizzare le variabili in sed ?

    
posta UAdapter 07.11.2011 - 17:30
fonte

2 risposte

273

La shell è responsabile per l'espansione delle variabili. Quando usi le virgolette singole per le stringhe, il suo contenuto verrà trattato letteralmente, quindi sed tenta ora di sostituire ogni occorrenza del% letterale% di% di $var1 .

Uso di virgolette

Usa le virgolette per far sì che la shell espanda le variabili preservando gli spazi:

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

Quando richiedi il carattere preventivo nella stringa di sostituzione, devi precederlo con una barra rovesciata che sarà interpretata dalla shell. Nell'esempio seguente, la stringa ZZ verrà sostituita da quote me (il carattere "quote me" è interpretato da & ):

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

Uso delle virgolette singole

Se hai molti metacaratteri della shell, considera l'uso di virgolette singole per il modello e virgolette doppie per la variabile:

sed -i 's,'"$pattern"',Say hurrah to &: 
-i
s,bert,Say hurrah to &: 
Say hurrah to bert: 
sed -i "s/$var1/ZZ/g" "$file"
/
/, text.txt
/,' "$file"

Nota come uso sed invece di s,pattern,replacement, , l'ho fatto per evitare interferenze con s/pattern/replacement/ in / .

Esempio

La shell esegue quindi il comando precedente sed/ con gli argomenti successivi (assumendo pattern=bert e file=text.txt ):

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

Se file.txt contiene bert , l'output sarà:

sed -i 's,'"$pattern"',Say hurrah to &: 
-i
s,bert,Say hurrah to &: 
Say hurrah to bert: %pre%/
/, text.txt
/,' "$file"
    
risposta data Lekensteyn 07.11.2011 - 18:20
fonte
85

Possiamo usare le variabili in sed usando le 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
    
risposta data mani 07.08.2014 - 17:29
fonte

Leggi altre domande sui tag