In realtà è abbastanza semplice con sed
:se una riga corrisponde basta copiarla nel h
vecchio spazio poi s
sostituire il valore.
Sulla$
t riga ex
cambia lo spazio di attesa e lo spazio del motivo, quindi controlla se quest'ultimo è vuoto. Se non è vuoto, significa che la sostituzione è già stata effettuata quindi niente da fare. Se è vuoto, significa che non è stata trovata alcuna corrispondenza, quindi sostituisci lo spazio del modello con la variabile=valore desiderata quindi aggiungi alla riga corrente nel buffer di attesa. Infine, ex
cambia di nuovo:
sed '/^FOOBAR=/{h;s/=.*/=newvalue/};${x;/^$/{s//FOOBAR=newvalue/;H};x}' infile
Quanto sopra è gnu sed
sintassi. Portatile:
sed '/^FOOBAR=/{
h
s/=.*/=newvalue/
}
${
x
/^$/{
s//FOOBAR=newvalue/
H
}
x
}' infile
Questo può probabilmente essere accorciato. Non è un singolo comando sed e usa anche grep, ma questo sembra essere fondamentalmente quello che vuoi. È una singola riga e modifica il file sul posto (nessun file temporaneo).
grep -q "^FOOBAR=" file && sed "s/^FOOBAR=.*/FOOBAR=newvalue/" -i file ||
sed "$ a\FOOBAR=newvalue" -i file
Ecco un sed
più semplice approccio, poiché non trovo sed
hold space
facile da lavorare. Se sei a tuo agio con hold space
, l'utilizzo dell'approccio don_crissti offre ulteriori opportunità di preservare qualsiasi cosa dalla linea esistente, ma di solito è molto raro.
In questo approccio, devi semplicemente stampare tutto tranne la riga che vuoi eliminare e poi, alla fine, aggiungere la sostituzione.
sed -n -e '/^FOOBAR=/!p' -e '$aFOOBAR=newvalue' infile