Pagina 1 di 1

[Risolto][BASH] aiuto su regex

Inviato: martedì 16 giugno 2015, 17:22
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

Re: [BASH] aiuto su regex

Inviato: martedì 16 giugno 2015, 17:28
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.

Re: [BASH] aiuto su regex

Inviato: martedì 16 giugno 2015, 17:36
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 '.*,\(.*\)')

Re: [BASH] aiuto su regex

Inviato: martedì 16 giugno 2015, 17:44
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?

Re: [BASH] aiuto su regex

Inviato: martedì 16 giugno 2015, 17:46
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

Re: [BASH] aiuto su regex

Inviato: martedì 16 giugno 2015, 18:03
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


Re: [BASH] aiuto su regex

Inviato: martedì 16 giugno 2015, 19:13
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

Re: [BASH] aiuto su regex

Inviato: mercoledì 17 giugno 2015, 10:28
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.

Re: [BASH] aiuto su regex

Inviato: mercoledì 17 giugno 2015, 19:30
da errullaiolo
Grazie mille non lo sapevo. Posso dire che si é conclusa con un risolto alla grande.