[bash] verifica e inserimento stringa in un file

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

Re: [bash] verifica e inserimento stringa in un file

Messaggio da piccolotauro2 »

grazie mille e scusa....senti e per la verifica invece?nel senso prima di inserire il nodo con l'attributo vorrei verificare prima se c'è il nodo e poi, se il nodo c'è inserire l'attributo...
è fattibile secondo te?
grazie infinite
Avatar utente
tomm
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 796
Iscrizione: lunedì 15 ottobre 2007, 10:16
Desktop: Gnome
Distribuzione: Ubuntu 16.04

Re: [bash] verifica e inserimento stringa in un file

Messaggio da tomm »

Ho fatto un po' di prove e sembra essere problematico il caso quando il nodo esiste ma senza attributo. Cmq è sicuramente fattibile
Intanto, per verificare se il nodo esiste o meno puoi fare così:

Codice: Seleziona tutto

xmlstarlet sel -t -v "/Context/Manager" conf/context.xml
if [ $? = 0 ];then
    NODE_EXISTS=true
else 
    NODE_EXISTS=false
fi
un chiarimento a proposito della tua domanda di prima, /Context/Manager oppure solo Manager: devi includere anche /Context perché si tratta non di una semplice stringa da cercare ma di una espression XPATH: http://www.w3schools.com/xpath/xpath_syntax.asp
Avatar utente
tomm
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 796
Iscrizione: lunedì 15 ottobre 2007, 10:16
Desktop: Gnome
Distribuzione: Ubuntu 16.04

Re: [bash] verifica e inserimento stringa in un file

Messaggio da tomm »

allora, dimentica il post precedente perché non funziona.

Questo invece dovrebbe andare:

Codice: Seleziona tutto

FILE="conf/context.xml"
NODE=$(xmlstarlet el -a $FILE | grep -w "Context/Manager")
if [ "$NODE" = "" ];then
	xmlstarlet  ed -L --subnode "/Context" --type elem -n Manager -v ""  $FILE
fi

ATTRIBUTE=$( xmlstarlet el -a $FILE | grep -w "Context/Manager/@randomClass")

if [ "$ATTRIBUTE" = "" ];then
   # aggiungi attributo
  xmlstarlet ed -L -i '/Context/Manager' -t attr -n randomClass -v java.security.SecureRandom  $FILE
else
   # aggiorna attributo già esistente
  xmlstarlet ed -L -u '/Context/Manager/@randomClass' -v java.security.SecureRandom  $FILE
fi
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

Re: [bash] verifica e inserimento stringa in un file

Messaggio da piccolotauro2 »

lo proverò a brevissimo e sa va ti devo una statua in oro massiccio:)
nel frattempo ho provato il comando semplice di inserimento dell'attributo <Manager e dell'elemento.
Dopo che lo lancio a schermo mi fa vedere il risultato ed è corretto.
Ma se vado vedere il file con un banale cat la modifica non c'è...dovrei salvare il file in qualche modo praticamente per rendere effettiva la modifica?

grazie
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

Re: [bash] verifica e inserimento stringa in un file

Messaggio da piccolotauro2 »

ho provato lo script che mi hai mandato e funziona...:)
come posso ringraziarti?dalle mie parti si direbbe: cornetto e cappuccino è pagato:)
se avrò altri dubbi su alcune cose posso disturbarti?
thanks
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

Re: [bash] verifica e inserimento stringa in un file

Messaggio da piccolotauro2 »

per esempio una domanda già ce l'ho....nel mio caso si trattava di file xml ma laddove non fosse stato un xml avrei dovuto usare comandi tipo sed e awk?
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] verifica e inserimento stringa in un file

Messaggio da vaeVictis »

piccolotauro2 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4582490#p4582490][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:ho provato lo script che mi hai mandato e funziona...:)
come posso ringraziarti?dalle mie parti si direbbe: cornetto e cappuccino è pagato:)
se avrò altri dubbi su alcune cose posso disturbarti?
thanks
Rispondo io, perché sono domande non tanto personali quanto gestite dal regolamento del forum.
Come ringraziare? Usando i tag per il codice e mettendo risolto nel titolo del primo messaggio della discussione :)
Qualora ci fossero altri dubbi, non disturbi, ma apri una discussione pubblica, non mandare messaggi privati: non è lo spirito del forum :)
piccolotauro2 ha scritto:per esempio una domanda già ce l'ho....nel mio caso si trattava di file xml ma laddove non fosse stato un xml avrei dovuto usare comandi tipo sed e awk?
Ni.
Nel senso che se è un altro linguaggio analogo all'xml si usa un qualche parser apposito.
Anche in questo caso, comunque, era possibile farlo senza usare parser ma solamente bash, sed, awk e compagnia... ma la domanda è... perché?
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.»
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

Re: [bash] verifica e inserimento stringa in un file

Messaggio da piccolotauro2 »

hai ragione tra l'altro con sed e awk sarebbe stato un inferno perché andavano fatti 3mila controlli...ho fatto questa domanda perché perché avrò un caso analogo ma con un file non xml ma .conf....e quindi volevo capire una possibile soluzione generale
grazie
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] verifica e inserimento stringa in un file

Messaggio da vaeVictis »

No, a dire il vero bastava che ti segnavi la riga eventualmente trovata con grep.
Poi dallo stato di uscita di grep vedevi se la riga era stata trovata. Se era stata trovata, sapevi direttamente dove andare a modificare in base alla riga sostituita.
Altrimenti sapevi che non era stato trovato e te la giocavi facile.
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
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [bash] verifica e inserimento stringa in un file

Messaggio da vaeVictis »

p.s.: come sono strutturati i file .conf?
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.»
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

Re: [bash] verifica e inserimento stringa in un file

Messaggio da piccolotauro2 »

fondamentalmente ne ho aperto uno e hanno più o meno la stessa struttura di un file xml per cui si potrebbero adattare musa...devo sicuro controllare...
il discorso che dicevo io della difficoltà era legata ai controlli di esistenza ma poi anche ai tag di apertura e di chiusura che complicavano un po le cose perché andava sempre controllato se c'erano e dopo in caso inserirli...
comunque mi sto leggendo la tua risp di prima e mi sono un po perso a:
Poi dallo stato di uscita di grep vedevi se la riga era stata trovata. Se era stata trovata, sapevi direttamente dove andare a modificare in base alla riga sostituita.

:)
Avatar utente
tomm
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 796
Iscrizione: lunedì 15 ottobre 2007, 10:16
Desktop: Gnome
Distribuzione: Ubuntu 16.04

Re: [bash] verifica e inserimento stringa in un file

Messaggio da tomm »

file con estensione conf possono essere tranquillamente xml, indipendentemente dall'estensione.
Per verificare se un file (con qualsiasi estensione) è un xml o meno ti basta questo comando

Codice: Seleziona tutto

 xmlstarlet val -w  [NOME FILE COMPLETO DI ESTENSIONE]
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

Re: [bash] verifica e inserimento stringa in un file

Messaggio da piccolotauro2 »

tomm grazie mille:)spero di non avere più bisogno...ma penso sia una speranza difficile:)
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

Re: [bash] verifica e inserimento stringa in un file

Messaggio da piccolotauro2 »

potreste suggerirmi anche la procedura senza xmlstarlet?purtroppo mi trovo nella situazione di una modifica di un file non xml e dovrei fare l'identica cosa...cioè verificare se c'è una stringa e in caso contario inserirla...cioè devo Verificare che nel file di configurazione logging.properties siano stati definiti

java.util.logging.FileHandler.limit=10000000
e
java.util.logging.FileHandler.count=5

quindi dovrei controllare se non ci sono le stringhe e in caso contrai o inserirle
e fondamentalmente non è importante dove le inserisce....
scusate la seccatura...
grazie
Avatar utente
tomm
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 796
Iscrizione: lunedì 15 ottobre 2007, 10:16
Desktop: Gnome
Distribuzione: Ubuntu 16.04

Re: [bash] verifica e inserimento stringa in un file

Messaggio da tomm »

il contributo è volontario, per cui nessuna seccatura :)

Prova questo:

Codice: Seleziona tutto

# PERSONALIZZA QUI: sostituisci TUO_FILE con il nome del tuo file
FILE=TUO_FILE

set_property(){
	PROP="$1"
	VALUE="$2"
	PROP_FOUND=$(awk -F '=' '{  if(substr($1, 0, 1) != "#")  print $1}' $FILE|awk /$PROP/ )
	if [ "$PROP_FOUND" = "" ];then
		echo "$PROP=$VALUE" >> $FILE
	else 
		sed -i "s#^ *$PROP *=.*\$#$PROP=$VALUE#g" $FILE
	fi
}

set_property "java.util.logging.FileHandler.limit" "10000000"
set_property "java.util.logging.FileHandler.count" "5"
# .....
# qui puoi aggiungere altre property
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

Re: [bash] verifica e inserimento stringa in un file

Messaggio da piccolotauro2 »

tomm funziona alla perfezione....è impressionante:) grazie all'infinito...
giusto per capire...
in pratica set property è una funziona che riesce a scomporre la stringa in prop e value assegnando quindi a prop il valore che voglio?

grazie infinite
Avatar utente
tomm
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 796
Iscrizione: lunedì 15 ottobre 2007, 10:16
Desktop: Gnome
Distribuzione: Ubuntu 16.04

Re: [bash] verifica e inserimento stringa in un file

Messaggio da tomm »

si, la funzione richiama prima awk per verificare se la property già esiste e poi sed per aggiungerla o per correggere quella già esistente.
Praticamente awk scompone le linee in prop e value usando in segno uguale come delimitatore:

Codice: Seleziona tutto

awk -F '=' '{  if(substr($1, 0, 1) != "#")  print $1}'
Questo scompone la linea e ne stampa la prima parte solo se non comincia per #. Righe che cominciano con # sono commenti e vengono ignorati.
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

Re: [bash] verifica e inserimento stringa in un file

Messaggio da piccolotauro2 »

perfetto e nel caso non ci fosse stato l'uguale?= nel senso se non c'era il delimitatore andava fatta solo una verifica sulla esistenza della stringa totale?
cioè direttamente il sed praticamente
Avatar utente
tomm
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 796
Iscrizione: lunedì 15 ottobre 2007, 10:16
Desktop: Gnome
Distribuzione: Ubuntu 16.04

Re: [bash] verifica e inserimento stringa in un file

Messaggio da tomm »

ovviamente se non c'è l'uguale si fa in un altro modo, ma questo è un property file di una applicazione in java e deve rispettare delle regole precise.

Praticamente la domanda "nel caso non ci fosse stato l'uguale" non ha senso, perché se non c'è l'uguale si tratta di un altro tipo di file e il problema va risolto in maniera diversa.
Non puoi fare uno script che va bene per tutti i casi possibili, perché i casi possibili sono infiniti (o quasi)
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

Re: [bash] verifica e inserimento stringa in un file

Messaggio da piccolotauro2 »

chiarissimo...
nel caso in cui fosse stato di verificare che ci fosse:

SSLProtocol - ALL +TLSv1

pensavo bastava inserire direttamente il sed
volevo farmi una idea....tra l'altro in questo caso ci sonda anche più spazi quindi non si può sostituire l'uguale con lo spazio vuoto...
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti