[RISOLTO] Pulire un parametro o una variabile dai caratteri indesiderati

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
clivend
Prode Principiante
Messaggi: 35
Iscrizione: mercoledì 13 maggio 2009, 22:41

[RISOLTO] Pulire un parametro o una variabile dai caratteri indesiderati

Messaggio da clivend »

Salve a tutti. Se ad uno script passo come parametro qualcosa come una data in formato "24/08/08", come faccio a memorizzarla in una variabile nel formato 240808, ovvero come cancello i caratteri indesiderati? Grazie!
Ultima modifica di clivend il mercoledì 7 settembre 2011, 11:37, modificato 1 volta in totale.
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: Shell scripting. Pulire un parametro o una variabile dai caratteri indesiderati

Messaggio da Zoff »

Codice: Seleziona tutto

echo "24/08/08" | tr -cd '[[:digit:]]'
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
Otako
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1424
Iscrizione: giovedì 10 giugno 2010, 22:01
Desktop: pantheon
Distribuzione: elementary OS Luna x86_64
Località: Villafranca di Verona

Re: Shell scripting. Pulire un parametro o una variabile dai caratteri indesiderati

Messaggio da Otako »

Prima che qualcuno ti risponda di come fare con sed o tr ti posto questa versione:

Codice: Seleziona tutto

echo 24/08/08 | python -c 'print(__import__("sys").stdin.read().replace("/","").strip())'
(toglie tutti gli slash).
p=__import__("string").printable;print("".join(p[p.index(l)-1] for l in "gfssbspwjmmb[hnbjm/dpn"))
Ricordatevi di utilizzare @memoize per le vostre funzioni.
l3on4rdo

Re: Shell scripting. Pulire un parametro o una variabile dai caratteri indesiderati

Messaggio da l3on4rdo »

con le manipolazioni di stringa fornite da bash, per esempio.
vedi qui, al paragrafo "27-4. String operations on arrays"

un esempio, con la tua data:

Codice: Seleziona tutto

l3on4rdo@l3on4rdo-laptop:~$ data="24/08/08"
l3on4rdo@l3on4rdo-laptop:~$ echo $data
24/08/08
l3on4rdo@l3on4rdo-laptop:~$ echo ${data[@]//\//}
240808
l3on4rdo@l3on4rdo-laptop:~$ 
pertanto la modifica è:

Codice: Seleziona tutto

data_purgata=${data[@]//\//}
ciao
Ultima modifica di l3on4rdo il mercoledì 7 settembre 2011, 11:02, modificato 1 volta in totale.
clivend
Prode Principiante
Messaggi: 35
Iscrizione: mercoledì 13 maggio 2009, 22:41

Re: Shell scripting. Pulire un parametro o una variabile dai caratteri indesiderati

Messaggio da clivend »

grazie a tutti per i preziosi contributi, alla fine ho risolto con

Codice: Seleziona tutto

echo $current_line_parameter | tr -d "/"
e con la scusa ho scoperto anche l'utilissimo comando sed  ;D
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [RISOLTO] Pulire un parametro o una variabile dai caratteri indesiderati

Messaggio da Zoff »

il comando da me indicato rimuve tutto quello che non è un numero quindi puoi avere: "123quelv@tte|apèsc@cHetipare456"
e otterrai sempre 123456
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
l3on4rdo

Re: [RISOLTO] Pulire un parametro o una variabile dai caratteri indesiderati

Messaggio da l3on4rdo »

Con le operazioni di stringa, invece, per far restare solo i numeri e rimuovere tutto quello che non è numero, si fa così:

Codice: Seleziona tutto

echo ${data[@]//[^[:digit:]]/}
240808
Lo dico perché il metodo precedente eliminava le / dalla data.
Questo invece elimina i separatori indipendentemente da quali essi siano.

ciao

edit:
a margine faccio notare che le operazioni di stringa sono più performanti
(anche se (per stringhe così corte) parliamo di puffosecondi ;D )

Codice: Seleziona tutto

l3on4rdo@l3on4rdo-laptop:~$ data="123quelv@tte|apèsc@cHetipare456"
l3on4rdo@l3on4rdo-laptop:~$ time echo $data | tr -cd '[[:digit:]]'
123456
real	0m0.005s
user	0m0.010s
sys	0m0.010s
l3on4rdo@l3on4rdo-laptop:~$ time echo ${data[@]//[^[:digit:]]/}
123456

real	0m0.002s
user	0m0.000s
sys	0m0.000s
... mentre per stringhe più lunghe non capisco se seguano una qualche "legge" che collega il tempo di esecuzione alla lunghezza della stringa  :-[
ma sarebbe interessante (credo) indagare :)

riciao
Ultima modifica di l3on4rdo il mercoledì 7 settembre 2011, 12:37, modificato 1 volta in totale.
Avatar utente
Sorriso.
Prode Principiante
Messaggi: 29
Iscrizione: martedì 30 agosto 2011, 20:56

Re: [RISOLTO] Pulire un parametro o una variabile dai caratteri indesiderati

Messaggio da Sorriso. »

Sono arrivato in ritardo.
Ma penso che un'altra soluzione, oltre a quelle già postate, potrebbe essere l'utilizzo delle regex.
Ti spiego la sua struttura.
Allora devi salvare tutto ciò che è un numero. Quindi, ammesso che la struttura della stringa sia:

Codice: Seleziona tutto

n/n/n
Di conseguenza farai una regex del genere:

Codice: Seleziona tutto

=~/(\d)/w
Ora, non conosco bene le regex quindi può essere che sbaglio. Però il ragionamento è: prendi tutto ciò che è una cifra numerica e salvalo in una variabile ( $1, $2, $3, etc. etc. ) e poi le unisci:

Codice: Seleziona tutto

echo $1.$2.$3;
Avatar utente
Otako
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1424
Iscrizione: giovedì 10 giugno 2010, 22:01
Desktop: pantheon
Distribuzione: elementary OS Luna x86_64
Località: Villafranca di Verona

Re: [RISOLTO] Pulire un parametro o una variabile dai caratteri indesiderati

Messaggio da Otako »

Sorriso. ha scritto: Sono arrivato in ritardo.
Ma penso che un'altra soluzione, oltre a quelle già postate, potrebbe essere l'utilizzo delle regex.
Ti spiego la sua struttura.
Allora devi salvare tutto ciò che è un numero. Quindi, ammesso che la struttura della stringa sia:

Codice: Seleziona tutto

n/n/n
Di conseguenza farai una regex del genere:

Codice: Seleziona tutto

=~/(\d)/w
Ora, non conosco bene le regex quindi può essere che sbaglio. Però il ragionamento è: prendi tutto ciò che è una cifra numerica e salvalo in una variabile ( $1, $2, $3, etc. etc. ) e poi le unisci:

Codice: Seleziona tutto

echo $1.$2.$3;
Non è un po' complesso rispetto alle soluzioni già proposte?  ;D
p=__import__("string").printable;print("".join(p[p.index(l)-1] for l in "gfssbspwjmmb[hnbjm/dpn"))
Ricordatevi di utilizzare @memoize per le vostre funzioni.
Avatar utente
Sorriso.
Prode Principiante
Messaggi: 29
Iscrizione: martedì 30 agosto 2011, 20:56

Re: [RISOLTO] Pulire un parametro o una variabile dai caratteri indesiderati

Messaggio da Sorriso. »

Otako ha scritto:
Sorriso. ha scritto: Sono arrivato in ritardo.
Ma penso che un'altra soluzione, oltre a quelle già postate, potrebbe essere l'utilizzo delle regex.
Ti spiego la sua struttura.
Allora devi salvare tutto ciò che è un numero. Quindi, ammesso che la struttura della stringa sia:

Codice: Seleziona tutto

n/n/n
Di conseguenza farai una regex del genere:

Codice: Seleziona tutto

=~/(\d)/w
Ora, non conosco bene le regex quindi può essere che sbaglio. Però il ragionamento è: prendi tutto ciò che è una cifra numerica e salvalo in una variabile ( $1, $2, $3, etc. etc. ) e poi le unisci:

Codice: Seleziona tutto

echo $1.$2.$3;
Non è un po' complesso rispetto alle soluzioni già proposte?  ;D
Bé in generale le regex sono più complicate dell'utilizzo delle funzioni. Però se si impara a usare le regex, nel momento in cui viene a mancare una funzione, se ne può fare un'altra ;).
clivend
Prode Principiante
Messaggi: 35
Iscrizione: mercoledì 13 maggio 2009, 22:41

Re: Shell scripting. Pulire un parametro o una variabile dai caratteri indesiderati

Messaggio da clivend »

l3on4rdo ha scritto: con le manipolazioni di stringa fornite da bash, per esempio.
vedi qui, al paragrafo "27-4. String operations on arrays"

un esempio, con la tua data:

Codice: Seleziona tutto

l3on4rdo@l3on4rdo-laptop:~$ data="24/08/08"
l3on4rdo@l3on4rdo-laptop:~$ echo $data
24/08/08
l3on4rdo@l3on4rdo-laptop:~$ echo ${data[@]//\//}
240808
l3on4rdo@l3on4rdo-laptop:~$ 
pertanto la modifica è:

Codice: Seleziona tutto

data_purgata=${data[@]//\//}
ciao
potresti spiegare meglio il funzionamento? che funzionè ha ogni simbolo?
l3on4rdo

Re: [RISOLTO] Pulire un parametro o una variabile dai caratteri indesiderati

Messaggio da l3on4rdo »

... non l'ho mai capito! ;D
scherzo.

Suppongo che ti riferisci solo a questo:

Codice: Seleziona tutto

${data[@]//\//}
quindi:
1)

Codice: Seleziona tutto

${data[@]}
indica che devi prendere tutti gli elementi del array data

2) le / nell'ordine in cui compaiono indicano
(le prime due //) che voglio sostituire tutte le occorrenze (con un solo / elimini solo la prima) di quello che sta dopo...
ovvero di \/
in cui \ è il carattere per fare l'escape dei caratteri speciali (in quanto / è un carattere speciale di bash)
e / è il carattere speciale
e sostituirlo con quello che sta dopo la / successiva a \/... ovvero lo sostituisco con niente, perché non c'è niente


Ma siccome qui è un bordello di slash e controslash... ti faccio un esempio più terrestre!

dalla stringa:

Codice: Seleziona tutto

3on4rdo@l3on4rdo-laptop:~$ stringa="abcdabcdabcd"
l3on4rdo@l3on4rdo-laptop:~$ echo ${stringa}
abcdabcdabcd
sostituisco solo la prima occorrenza di a minuscola con A maiuscola

Codice: Seleziona tutto

l3on4rdo@l3on4rdo-laptop:~$ echo ${stringa[@]/a/A}
Abcdabcdabcd
oppure, come nel caso della tua data, le sostituisco tutte:

Codice: Seleziona tutto

l3on4rdo@l3on4rdo-laptop:~$ echo ${stringa[@]//a/A}
AbcdAbcdAbcd
Per riportare questo ultimo esempio al caso precedente
stringa è data
i primi due // indicano che vuoi sostituire tutte le occorrenze
la a è il carattere da sostituire ed è l'analogo di \/ in cui \ serve per fare l'escape di / (per a non serve perché non è un carattere speciale di bash)
la A indica ciò con cui vuoi sostituire... tu prima volevi eliminare e quindi nel caso della data non ci mettevi nulla al posto della A.


Spero davvero di essere stato chiaro.
Se così non fosse, chiedi pure.

ciao

ps: questo metodo è legato al fatto che hai / come separatore. se vuoi invece eliminare tutto ciò che non è numero usi:

Codice: Seleziona tutto

echo ${data[@]//[^[:digit:]]/}
in cui la sostanza è la stessa, ma con [^[:digit:]] che indica "tutto ciò che numero non è"

pps: ad essere proprio pignoli, in questo caso di una stringa e non di un array (per come lo intende bash l'array) puoi anche omettere la parte

Codice: Seleziona tutto

[@]
... ma io non lo ometto perché poi sbaglio quando ho a che fare con gli array invece che con le stringhe.

ppps: ti ho postato un link che è una miniera di informazioni su 'sta roba! ;)
Ultima modifica di l3on4rdo il mercoledì 7 settembre 2011, 17:56, modificato 1 volta in totale.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti