Domanda Come si usano le variabili in un comando sed?


Ho provato il seguente codice da 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 uso le variabili in sed?


178
2017-11-07 16:30


origine


vedere la mia risposta in questo tuo post - ata
relazionato: stackoverflow.com/questions/407523/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


risposte:


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

Usando 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 quote me sarà sostituito da "quote me" (il personaggio & è interpretato da sed):

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

Utilizzando le 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 &: \0/,' "$file"

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

Esempio

La shell quindi esegue 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/

252
2017-11-07 17:20



Come si passa l'opzione "/ g" usando questo modulo separato da virgole? - blong
@ b.long È a g opzione, così passeresti s,foo,bar,g anziché. - Lekensteyn
il tuo singolo esempio di citazione è particolarmente utile, copre sed con pattern regex molto graziosamente! - Brian Thomas
Nel caso in cui si è tentati di utilizzare \\0 invece di \0, non dovrebbe essere fatto quando \0 è racchiuso tra virgolette singole. Altrimenti sed sostituirà il modello per un letterale \0 invece dell'intera partita. - Lekensteyn


Possiamo usare le variabili in sed usando doppie virgolette:

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

Se hai una barra / nella variabile quindi utilizzare separatore diverso, come di seguito:

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

78
2017-08-07 15:29