Sono un principiante di Linux relativo. Supponiamo di avere un file di testo a.txt
che contiene il seguente testo:
A
B
C
Ora, se voglio cambiare il testo sulla riga 2 (che contiene B
), posso usare il seguente sed
comando:
sed -i '2s/^.*$/X/' a.txt
per cambiare la B
a X
, per esempio.
Ma ora supponiamo che io voglia scrivere un sed
comando che cambia il testo della riga 2 in qualcosa che include una variabile stringa bash. Voglio cambiare il testo della riga 2 in fname="myaddress"
, dove le virgolette sono incluse in modo esplicito e dove myaddress
è una variabile stringa bash (definito altrove). Per provare a farlo, ho creato uno script di shell bash chiamato mytest.sh
e contenente quanto segue:
#!/bin/bash
myaddress="/home/"
echo fname="$myaddress"
head a.txt
sed -i '2s/^.*$/fname="$myaddress"/' a.txt
head a.txt
Ora, echo fname="$myaddress"
stampa fname="/home/"
, che è il testo che voglio essere sulla riga 2 di a.txt
. Tuttavia, sed
invece stampa fname="$myaddress"
alla riga 2 di a.txt
, probabilmente perché si trova all'interno degli apostrofi circostanti. In altre parole, l'output dello script della shell bash sopra è:
fname="/home/"
A
B
C
A
fname="$myaddress"
C
La mia domanda è:come posso ottenere sed
per stampare effettivamente il valore memorizzato in myaddress
e referenziato da $myaddress
?
Risposta accettata:
Ci sono due problemi:primo, come già notato da Kevin, le variabili della shell devono essere racchiuse tra virgolette se devono essere espanse dalla shell. In secondo luogo, la tua stringa sostitutiva contiene un /
, quindi non puoi usare /
allo stesso tempo come delimitatore per sed
. Se conosci quel qualche carattere, dì ,
, sicuramente non si verificherà nella stringa di sostituzione, puoi usare quel carattere come sed
delimitatore, quindi ottieni
sed -i '2s,^.*$,fname="'"$myaddress"'",' a.txt