[bash] modifica in automatico file di inizializzazione

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
difesaparcosempione
Rampante Reduce
Rampante Reduce
Messaggi: 6031
Iscrizione: giovedì 27 luglio 2006, 19:06
Località: Torino
Contatti:

[bash] modifica in automatico file di inizializzazione

Messaggio da difesaparcosempione »

Un aiutINO/ONE !!
Dato un file di testo del tipo
var1=valore1
var2=valore2
var3=valore3
etc etc , contenente ogni tanto delle righe di "commento" o "[inizio sezione]" vorrei un aiuto del tipo:

dato il nome della variabile ed un valore cambiare il valore assegnato alla variabile nel file. Per scontato la variabile è sempre presente.
Di scontato è che non ci sono caratteri prima della variabile (spazi,tab etc etc)

ciao
:ciao:
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [bash]Aiuto, modifica in automatico file di inizializzaz

Messaggio da vaeVictis »

La riga la "becchi" con gli address, la modifica la fai al solito modo.
Con un file di questo tipo:

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~/Scrivania$ cat foo.txt 
var1=valore1
var2=valore2
var3=valore3
#commento
var1=valore1
var2=valore2
var3=valore3
#commento
var1=valore1
var2=valore2
var3=valore3
#commento
var1=valore1
var2=valore2
var3=valore3
#commento
var1=valore1
var2=valore2
var3=valore3
modifichi il valore2 associato ad ogni var2 in calore2 :)

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~/Scrivania$ sed "/^var2/s/valore/calore/" foo.txt 
var1=valore1
var2=calore2
var3=valore3
#commento
var1=valore1
var2=calore2
var3=valore3
#commento
var1=valore1
var2=calore2
var3=valore3
#commento
var1=valore1
var2=calore2
var3=valore3
#commento
var1=valore1
var2=calore2
var3=valore3
... anche se mi sa che una cosa del genere sei in grado di farla... quindi mi chiedo se ho capito.
E lo chiedo anche a te... ho capito?
Se la mia comprensione del problema è sulla buona strada, magari poi andiamo avanti.
Per andare avanti intendo la modifica della sola prima occorrenza, l'uso di variabili per la parola da sostituire e la parola con cui sostituirla e via dicendo.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da crap0101 »

imho, vuole fare una cosa un pò diversa... sostituire il valore (qualsiasi esso sia) a una data variabile con uno nuovo, e non sostituire un certo valore di una certa variabile con un altro. Per cui sarebbe una cosa così:

Codice: Seleziona tutto

crap0101@orange:/tmp/FOO$ sed -r "/^var2/s/(^.*=).*/\1calore/" foo.txt
var1=valore1
var2=calore
var3=valore3
#commento
var1=valore1
var2=calore
var3=valore3
#commento
var1=valore1
var2=calore
var3=valore3
#commento
var1=valore1
var2=calore
var3=valore3
#commento
var1=valore1
var2=calore
var3=valore3
oppure

Codice: Seleziona tutto

crap0101@orange:/tmp/FOO$ varname=var2
crap0101@orange:/tmp/FOO$ sed  "s/^${varname}=.*/${varname}=calore/" foo.txt
var1=valore1
var2=calore
var3=valore3
#commento
var1=valore1
var2=calore
var3=valore3
#commento
var1=valore1
var2=calore
var3=valore3
#commento
var1=valore1
var2=calore
var3=valore3
#commento
var1=valore1
var2=calore
var3=valore3
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da vaeVictis »

Queste due varianti erano incluse nell' "andare avanti" :)
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
difesaparcosempione
Rampante Reduce
Rampante Reduce
Messaggi: 6031
Iscrizione: giovedì 27 luglio 2006, 19:06
Località: Torino
Contatti:

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da difesaparcosempione »

Codice: Seleziona tutto

#sed -n "/PLANT_ID=/p" file.old
varold=`sed -n "/PLANT_ID=/p" file.old`
echo $varold
#sed -n "/PLANT_ID=/p" file.new
varnew=`sed -n "/PLANT_ID=/p" file.new`
echo $varnew
sed 's/'${varnew}'/'${varold}'/' file.new
#ha funzionato
Ho 2 versione di file (new,old). In comune hanno delle variabili. Devo scrivere nel file "new" valori già presenti nel "old" che per me sono "da tenere". ( nel caso la var PLANT_ID= )
Adesso rileggendo con calma il mio post, ho scoperto di essere stato molto ma molto ma tanto molto sintetico !!
Come ho fatto nel mio esempio è valido ?
Le variabili da mantenere nel passaggio old->new sono più di una e quindi devo eseguire queste righe n volte!!
Non esistono alternative ? In sed conviene eseguire una modifica per volta ...
Ciao && Scusate per prima ...

:D

Questa soluzione "mia" ha il debole che le var devono essere sempre senza spazi tra gli = o all'inizio vero ?
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da vaeVictis »

Io non ho proprio capito.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
difesaparcosempione
Rampante Reduce
Rampante Reduce
Messaggi: 6031
Iscrizione: giovedì 27 luglio 2006, 19:06
Località: Torino
Contatti:

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da difesaparcosempione »

Due file NUOVO e VECCHIO

entrambi hanno la riga

VARIABILE_XYZ=

nel file NUOVO ho
VARIABILE_XYZ=ZZZZ
nel file VECCHIO ho
VARIABILE_XYZ=AAAA

alla fine della procedura ( sed )
nel file NUOVO avrò:
VARIABILE_XYZ=ZZZZ !! VOLEVO SCRIVERE AAAA :muro:

ok ?
ciao
Ultima modifica di difesaparcosempione il venerdì 28 marzo 2014, 17:36, modificato 1 volta in totale.
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da vaeVictis »

Questa è una di quelle volte in cui faccio fatica a capirti, ma siccome sono non demordo... chiedo ulteriori chiarimenti.

Che hai due file (NUOVO e VECCHIO) s'è capito.

Che entrambi contengono la riga

Codice: Seleziona tutto

VARIABILE_XYZ=
s'è capito.

Ora viene quello che non s'è capito!

Dici che nel file NUOVO hai:

Codice: Seleziona tutto

VARIABILE_XYZ=ZZZZ
e nel file VECCHIO hai:

Codice: Seleziona tutto

VARIABILE_XYZ=AAAA
E poi affermi che:
alla fine della procedura ( sed )
nel file NUOVO avrò:
VARIABILE_XYZ=ZZZZ
... ma non avevi anche inizialmente

Codice: Seleziona tutto

VARIABILE_XYZ=ZZZZ
nel file NUOVO?

Sul serio, io continuo a non capirti.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da UbuNuovo »

Per conto mio ha fatto l'esempio al contrario, ovvero, da quanto detto nel post precedente, dovrebbe mantenere il vecchio valore per una data variabile quindi se nel file nuovo c'è la variabile con un nuovo valore, questo deve essere sostituito con il vecchio valore del file vecchio.
Mamma mia, che contortume, non mi capisco nemmeno io.
Salva l'Ucraina! 🇺🇦
Avatar utente
difesaparcosempione
Rampante Reduce
Rampante Reduce
Messaggi: 6031
Iscrizione: giovedì 27 luglio 2006, 19:06
Località: Torino
Contatti:

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da difesaparcosempione »

Opps ho corretto il mio esempio ... era sbagliato !!
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da vaeVictis »

Se non hai fretta, ho bisogno di un po' di tempo per vedere una cosa a riguardo. Poi ti posto la mia considerazione :)
Stand by! :)
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da UbuNuovo »

Immagino che VaeVictis troverà una soluzione migliore, usando due file descriptor e/o sed, nel frattempo ho trovato un modo con awk.
Questo script considera che il numero di righe e l'ordine delle variabili sia uguale nei due file altrimenti si devono mettere due diverse variabili come indici degli array
(al posto di "i" -> "i" e "j" in modo da poter usare, per esempio, "nuovo_c1" e "vecchio_c1[J]")
e fare un'altra condizione di stampa e semmai in ulterore confronto se non esiste un ordine preciso.

con i file:

Codice: Seleziona tutto

8-) cat nuovo.txt 
var1=aaa
var2=bbb
var3=zzz
8-) cat vecchio.txt 
var1=aaa
var2=bbb
var3=ccc
Si può fare:

Codice: Seleziona tutto

8-) awk -F'=' 'BEGIN{i=0;var_da_mantenere="var3"}
> NR==FNR{nuovo_c1[i]=$1;nuovo_c2[i]=$2;i++;next} {vecchio_c1[i]=$1;vecchio_c2[i]=$1;i++}
> END{for(i=0;i<length(nuovo_c1);i++)
> if(nuovo_c1[i]==var_da_mantenere && nuovo_c1[i]==vecchio_c1[i] ){
> if(nuovo_c2[i] != vecchio_c2[i]) {print nuovo_c1[i],vecchio_c2[i];}
> }else print nuovo_c1[i],nuovo_c2[i];
> }' nuovo.txt vecchio.txt
var1 aaa
var2 bbb
var3 zzz
quindi si può reindirizzare l'output su file:

Codice: Seleziona tutto

awk -F'=' 'BEGIN{i=0;var_da_mantenere="var3"}
NR==FNR{nuovo_c1[i]=$1;nuovo_c2[i]=$2;i++;next} {vecchio_c1[i]=$1;vecchio_c2[i]=$1;i++}
END{for(i=0;i<length(nuovo_c1);i++)
if(nuovo_c1[i]==var_da_mantenere && nuovo_c1[i]==vecchio_c1[i] ){
if(nuovo_c2[i] != vecchio_c2[i]) {print nuovo_c1[i],vecchio_c2[i];}
}else print nuovo_c1[i],nuovo_c2[i];
}' nuovo.txt vecchio.txt > nuovo_corretto.txt
Naturalmente converrà inserire una variabile al posto della stringa in 'var_da_mantenere="var3"'.

Edit: avevo dimenticato l'OFS

Codice: Seleziona tutto

8-) awk 'BEGIN{FS="=";OFS="=";i=0;var_da_mantenere="var3"}
> NR==FNR{nuovo_c1[i]=$1;nuovo_c2[i]=$2;i++;next} {vecchio_c1[i]=$1;vecchio_c2[i]=$1;i++}
> END{for(i=0;i<length(nuovo_c1);i++)
> if(nuovo_c1[i]==var_da_mantenere && nuovo_c1[i]==vecchio_c1[i] ){
> if(nuovo_c2[i] != vecchio_c2[i]) {print nuovo_c1[i],vecchio_c2[i];}
> }else print nuovo_c1[i],nuovo_c2[i];
> }' nuovo.txt vecchio.txt
var1=aaa
var2=bbb
var3=zzz
Salva l'Ucraina! 🇺🇦
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da vaeVictis »

Non capisco se mi sta sfuggendo qualcosa, altrimenti non comprendo la necessità di tutto questo.
Si deve prendere il valore dopo l'uguale ( = ) su una riga che inizia con una determinata "parola", nel file OLD, e schiaffarlo dopo l'uguale su una determinata riga che inizia con la stessa "parola", nel file NEW.
Giusto?
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da UbuNuovo »

Si è come dici.
Ho solo voluto sperimentare la lettura di due file con awk. :D
Anzi, ne avevo fatta una versione più semplice che utilizzava tutta la riga, quindi solo $1 con separatore "\n" e funzionava solo che ho voluto sperimentare una versione più generica.
Salva l'Ucraina! 🇺🇦
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da vaeVictis »

Generico?
Insomma...
Questo script considera che il numero di righe e l'ordine delle variabili sia uguale nei due file altrimenti si devono mettere due diverse variabili come indici degli array
Io non sto postando nulla perché davvero non vedo quale sia la complessità di questa "cosa".
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da UbuNuovo »

Generico nel senso che è facile modificarlo per coprire situazioni diverse.
La complessità? Bo?
A occhio e croce, dato il nome della variabile si può prendere il valore della variabile da vecchio.txt (con grep e cut o con grep -Po) e poi sostituirlo in nuovo.txt con sed.
Salva l'Ucraina! 🇺🇦
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da UbuNuovo »

Codice: Seleziona tutto

8-) nome_var='var3'
8-) valore_da_mantenere=$(grep "$nome_var" vecchio.txt | cut -d= -f2 )
8-) sed "/$nome_var/ s/^.*$/$nome_var=$valore_da_mantenere/" nuovo.txt
var1=aaa
var2=bbb
var3=ccc
Intendevo una cosa così, potrebbe andare?
Ma pensavo che tu avessi in mente qualche sistemino prelibato! :)
Salva l'Ucraina! 🇺🇦
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da vaeVictis »

Secondo me mi sopravvaluti, comunque sì, io pensavo ad una cosa del genere.
Invece del cut avrei usato qualcos'altro. Per esempio

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~$ echo -e "var1=aaa\nvar2=bbb\nvar3=ccc"
var1=aaa
var2=bbb
var3=ccc
vaevictis@vaevictis-HAL:~$ echo -e "var1=aaa\nvar2=bbb\nvar3=ccc" | grep -oP 'var1=\K\w+'
aaa
Il problema di difesaparcosempione, oltre a quanto cripticamente si è espresso, è a quanto pare il fatto che siano presenti più variabili da modificare e il fatto che siano presenti spazi (non ho capito se delle variabili o se nel valore dopo l'uguale).
Io, ci stavo riflettendo ora al bagno, forse procederei in modo diverso a questo punto.
Se tanto le variabili hanno lo stesso nome nel file iniziale e finale, io mi creerei la stringa del comando da passare a sed una volta prelevate tutte le righe.
Dammi un po' di tempo e ti posto un esempio di codice di quanto sto dicendo.

Tra l'altro non so neanche quanto sia lungo questo file, quante siano in linea di massima queste variabili... e quindi non so neanche se valga la pena farlo.
Comunque dopo mi ci metto un attimo.
Ultima modifica di vaeVictis il sabato 29 marzo 2014, 19:28, modificato 1 volta in totale.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4457
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [bash] modifica in automatico file di inizializzazione

Messaggio da UbuNuovo »

Le informazioni scarseggiano.
Comunque credo che i file in questione siano da includere (con source) in qualche altro script e che le righe rappresentino vere e proprie assegnazioni di valori a variabili, di conseguenza i nomi delle variabili non possono contenere spazi e non possono esserci più variabili con lo stesso nome altrimenti si "sovrascriverebbero".
Ormai sono curioso di vedere gli sviluppi... resto in attesa. :ciao:
Salva l'Ucraina! 🇺🇦
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti