2013-12-13 10 views
22

Ho cercato online questa risposta e non riesco a trovarla.Come usare sed per sostituire la variabile di un file di configurazione?

Ho un file di configurazione che contiene:

VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE5 
VAR6=VALUE6 

e voglio cambiare il valore di VAR5 da Value5 a VALUE10. Sfortunatamente, non conosco il valore di VALUE5, quindi non posso cercarlo. Quindi in pratica ho bisogno di usare sed (o qualsiasi altra cosa) per sostituire il valore di VAR5 con qualsiasi valore con cui voglio sostituirlo.

Modifica: Grazie alla soluzione confermata sono stato in grado di utilizzare quanto segue in BASH per modificare il mio file di configurazione passando un argomento allo script di bash. Le barre sono state sostituite da virgole poiché il parametro che sto passando allo script conterrà le barre.

sed -i 's,^\(THISISMYVARIABLE=\).*,\1'THISISMYVALUE',' config.cfg 

mio file conteneva:

THISISMYVARIABLE=SOMEOLDVALUE 

Dopo aver eseguito il comando sed in bash

THISISMYVARIABLE=THISISMYVALUE 
+0

Da dove proviene "VALUE10"? Proviene da un'altra linea in questo stesso file? O è solo un valore arbitrario? – Sildoreth

+0

VAR5 nel mio file di configurazione è USER_INSTALL_DIR e VALUE10 è qualsiasi cosa, potrebbe essere spazzatura. Voglio rendere VAR5 o nel mio caso USER_INSTALL_DIR impostato su una variabile che ho passato tramite uno script bash. Quanto segue ha funzionato per me grazie al commento di anubhava. Ho anche sostituito le barre con le virgole dato che il parametro che il mio script bash prende contengono barre che passano da una directory utente. – SomeGuyOnAComputer

risposta

32

Si può provare questo sed:

sed -i.bak 's/^\(VAR5=\).*/\1VALUE10/' file 

Dà:

VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE10 
VAR6=VALUE6 
+3

+1. Voglio solo fornirne un altro, un po 'più semplice (ma meno potente, funziona solo se conosciamo esattamente l'inizio): 'sed -i.bak'/^ VAR5 =. */VAR5 = VALUE10/'file' –

+0

Il problema con entrambe queste risposte è che richiede di conoscere il valore di VAR5. Nel mio caso, non si conosce il valore di VAR5, quindi si desidera trovare "VAR5 =" e trovare la stringa tra quella e la nuova riga. – SomeGuyOnAComputer

+1

Il valore di 'VAR5' era' VALUE5' nel tuo esempio e questa risposta non aveva bisogno di sapere 'VALUE5' – anubhava

3

Si può dire:

sed '/^VAR5=/s/=.*/=VALUE10/' filename 

Per rendere la modifica al file sul posto, utilizzare l'opzione -i:

sed -i '/^VAR5=/s/=.*/=VALUE10/' filename 
0

Provate il seguente

sed -r 's/^ (VAR5 =). */\ 1REPLACEMENT /'

Il valore di VAR5 sarà sostituito con SOSTITUZIONE.

1
sed '/\(^VAR5=\).*/ s//\1VALUE10/' YourFile 

Sotto AIX/KSH

$ cat sample.txt 
VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE5 
VAR6=VALUE6 

$ sed '/\(^VAR5=\).*/ s//\1VALUE10/' sample.txt 
VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE10 
VAR6=VALUE6 

e per la sostituzione di file di

cat <> YourFile | sed '/\(^VAR5=\).*/ s//\1VALUE10/' 

$ cat <> sample.txt | sed '/\(^VAR5=\).*/ s//\1VALUE10/' 
$ cat sample.txt 
VAR1=VALUE1 
VAR2=VALUE2 
VAR3=VALUE3 
VAR4=VALUE4 
VAR5=VALUE10 
VAR6=VALUE6 

Per essere POSIX (su sed parte, non cat) conforme (sed --posix su GNU sed e nativamente tradizionale su sistema non linux)

+1

Non c'è niente POSIX in merito a [uso inutile di 'cat'] (http : //partmaps.org/era/unix/award.html). Anche quel diamante '<>' sembra completamente fuori posto. – tripleee

4

Anche t hough la risposta è stata aggiunta alla domanda.Ho trascorso qualche tempo su come funziona, vorrei aggiungere alcuni fatti e la mia versione della risposta,

sed -i 's,^\(THISISMYVARIABLE[ ]*=\).*,\1'THISISMYVALUE',g' config.cfg 

Spiegazione:

  • Come base di sed 's/find_this/replace_with/', stiamo dicendo sed di cercare e sostituire. Ricorda inoltre che esistono più altri delimitatori che è possibile utilizzare al posto di /. Qui viene utilizzato ,.
  • Qui troviamo la riga corrispondente a ^\(THISISMYVARIABLE[ ]*=\).*. Ciò significa che stiamo raggruppando la partita THISISMYVARIABLE[ ]*=. ([ ]* da coprire se ci sono spazi dopo la chiave)
  • In sostituzione, la sezione \1 è un riferimento all'indietro. Facciamo riferimento al primo gruppo nell'espressione regolare che abbiamo usato per la corrispondenza.
+0

THISISMYVALUE è senza virgolette secondo l'op. Perché spazi prima uguali, sembra sbagliato! Il resto è valido, il riferimento posteriore è il nome giusto .. – Timo

Problemi correlati