[Risolto][BASH] aiuto su regex

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
errullaiolo
Prode Principiante
Messaggi: 185
Iscrizione: giovedì 17 gennaio 2013, 14:09
Distribuzione: Ubuntu 14.04.2 LTS
Sesso: Maschile

[Risolto][BASH] aiuto su regex

Messaggio da errullaiolo »

Leggo da stdin <username,password> e voglio che una variabile usr contenga la mia username e la variabile pas la mia password.
Per prelevare l'username creo un pattern che va dall'inizio della stringa fino alla virgola e vado a prendermi la sottostringa fino a len-1.
Per la password non riesco a matchare dalla virgola alla fine. Avete qualche consiglio?

Codice: Seleziona tutto

#!/bin/bash

read usr_pass

function check_usr_pass()
{
    usr=`expr match "$1" '\(.*,\)'`
    usr=${usr:0:$(( ${#usr} -1  ))}
  
    pass=
}

check_usr_pass $usr_pass

exit 0
Ultima modifica di errullaiolo il mercoledì 17 giugno 2015, 19:32, modificato 1 volta in totale.
« Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. »
(Sherlock Holmes)
Avatar utente
errullaiolo
Prode Principiante
Messaggi: 185
Iscrizione: giovedì 17 gennaio 2013, 14:09
Distribuzione: Ubuntu 14.04.2 LTS
Sesso: Maschile

Re: [BASH] aiuto su regex

Messaggio da errullaiolo »

Può essere risolto anche in altri modi, giustamente avendo la lunghezza dell'username e quella della stringa tot potrei fare:
len(stringaTot) - len(username compresa di virgola)

Codice: Seleziona tutto

${1:len(username+,):len(stringaTot)}
Ma vorrei capire la regex.
« Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. »
(Sherlock Holmes)
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [BASH] aiuto su regex

Messaggio da Zoff »

Per la virgola nello username basta metterla fuori dalle parentesi:

Codice: Seleziona tutto

usr=`expr match "$1" '\(.*\),'`
Per la password devi rigordarti di inserire nel pattern anche le lettere precedenti la virgola, senza parentesi per non raccogliere il match:

Codice: Seleziona tutto

pas=$(expr match $1 '.*,\(.*\)')
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
errullaiolo
Prode Principiante
Messaggi: 185
Iscrizione: giovedì 17 gennaio 2013, 14:09
Distribuzione: Ubuntu 14.04.2 LTS
Sesso: Maschile

Re: [BASH] aiuto su regex

Messaggio da errullaiolo »

Wow grazie. Quindi con le parentesi raccolgo tutto c'ho che fa match col pattern tra parentesi. Il resto lo controlla e basta?
« Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. »
(Sherlock Holmes)
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 su regex

Messaggio da vaeVictis »

Se la stringa username,password contiene solo la virgola di separazione dei due campi, e non altre virgole contenute nello username o nella password, io lascerei stare le espressioni regolari e userei le operazioni sugli array:

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~$ foo=username,password
vaevictis@vaevictis-N56VV:~$ echo ${foo%%,*}
username
vaevictis@vaevictis-N56VV:~$ echo ${foo##*,}
password
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
errullaiolo
Prode Principiante
Messaggi: 185
Iscrizione: giovedì 17 gennaio 2013, 14:09
Distribuzione: Ubuntu 14.04.2 LTS
Sesso: Maschile

Re: [BASH] aiuto su regex

Messaggio da errullaiolo »

Caspita è vero non mi ricordavo. Potreste ricordarmi la differenza tra ${foo%,*} ${foo#*,} e ${foo%%,*} $foo{##*,} ?
L'equal tilde operator: "ciao" =~ [a] controlla se la 'a' è presente in 'ciao' oppure faccio "ciao" =~ .*[a].* ?

Comunque risolto, un pò farraginoso ma funzionante. :D

Codice: Seleziona tutto

#!/bin/bash

read usr_pass

function check_usr()
{
    if [ ${#1} -lt 5 ] || [[ $1 =~ [^a-zA-Z0-9] ]] || [[ $1 =~ ^[0-9] ]]; then
	echo "Errore Autenticazione">out
	exit 12
    fi
}

function check_pass()
{
    if [ ${#1} -lt 3 ] || [[ $1 =~ [^a-z0-9] ]]; then
	echo "Errore Autenticazione">out
	exit 12
    fi
}

function check_usr_pass()
{
    usr=`expr match "$1" '\(.*,\)'`
    if [ $? -ne 1 ]; then
	usr=${usr:0:$(( ${#usr} -1  ))}
	else
	echo "Errore Autenticazione">out
	exit 12
    fi
    check_usr $usr

    pass=`expr match "$1" '.*,\(.*\)'`
    check_pass $pass
   
}

# CHECK USERNAME AND PASSWORD #
check_usr_pass $usr_pass      #
##############################

echo "username:$usr;password:$pass">out
exit 56

« Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. »
(Sherlock Holmes)
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 su regex

Messaggio da vaeVictis »

Alle domande del tuo ultimo messaggio risponde già il materiale disponibile online, che va *rigorosamente* ottimizzato :)
Operazioni su stringa (vedi il punto: Example 27-4. String operations on arrays)
Equal tilde operator
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
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [BASH] aiuto su regex

Messaggio da Zoff »

Beh se si tratta di fare le cose per bene allora molto meglio evitare l'invio delle credenziali in chiaro come opzione dello script, optando per la lettura da STDIN con read e l'opzione -s per la password.
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
errullaiolo
Prode Principiante
Messaggi: 185
Iscrizione: giovedì 17 gennaio 2013, 14:09
Distribuzione: Ubuntu 14.04.2 LTS
Sesso: Maschile

Re: [BASH] aiuto su regex

Messaggio da errullaiolo »

Grazie mille non lo sapevo. Posso dire che si é conclusa con un risolto alla grande.
« Una volta eliminato l'impossibile, ciò che resta, per quanto improbabile, deve essere la verità. »
(Sherlock Holmes)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti