Pagina 1 di 4

[BASH] Riconoscere nome completo da nome corto

Inviato: ven 19 feb 2010, 14:57
da ulisse89
Ciao a tutti. Mi servirebbe sapere come fare, data una stringa, che rappresenta il nome di un pacchetto (di slackware), come riconoscere se è un nome completo ( xvidcore-1.2.2-i486-2sl) o corto ( xvidcore ).

Fino ad ora avevo fatto in questa maniera:

Codice: Seleziona tutto

echo "$PACKAGE" | grep -q "\-[0-9]"
if [ "$?" == 0 ]; then
NOMECOMPLETO
else
NOMECORTO
Ma questa è una soluzione molto grezza che in molti casi sbaglia ( vedi "ntfs-3g" ).

Qualcuno mi saprebbe aiutare?
Grazie.

PS: Non è questione di vita o di morte, sto solo facendo pratica di bash scripting scrivendo un piccolo programma che risolve le dipendenze.

Re: [BASH] Riconoscere nome completo da nome corto

Inviato: ven 19 feb 2010, 15:37
da proffi
Beh è una soluzione semplice che può funzionare quella che hai pensato, un problema che vedo è che se il numero di versione principale è a due cifre non funzionerà a dovere. Inoltre, per risolvere il problema con nomi del tipo ntfs-3g basta verificare che dopo il numero di versione sia presente un punto.
Prova a sostituire la prima riga con questo:

Codice: Seleziona tutto

echo "$PACKAGE" | grep -q '.*-[0-9]*\.'
.* verifica una sequena qualsiasi di caratteri, [0-9]* una sequenza qualsiasi di numeri e \. verifica il punto (nota che si deve usare il carattere di escape \ ).

Spero funzioni.

Ciao

Re: [BASH] Riconoscere nome completo da nome corto

Inviato: ven 19 feb 2010, 15:42
da ulisse89
Ok grazie mille. Appena posso provo e ti faccio sapere.

Re: [BASH] Riconoscere nome completo da nome corto

Inviato: ven 19 feb 2010, 16:18
da Paoletta
un'altra alternativa che puoi usare è sfruttare il fatto che i pacchetti completi hanno (in fondo) sempre un numero che identifica le volte in cui il pacchetto è stato ricompilato e una sequenza di lettere che ne identifica l'autore; verrebbe fuori qualcosa del genere:

Codice: Seleziona tutto

echo "$PACKAGE" | grep -q "\-[0-9][0-9]*[a-z][a-z]*"
if [ "$?" == 0 ]; then
          echo NOMECOMPLETO
else
          echo NOMECORTO

Re: [BASH] Riconoscere nome completo da nome corto

Inviato: ven 19 feb 2010, 16:23
da Ansa89
Paoletta ha scritto:

Codice: Seleziona tutto

echo "$PACKAGE" | grep -q "\-[0-9][0-9]*[a-z][a-z]*"
if [ "$?" == 0 ]; then
          echo NOMECOMPLETO
else
          echo NOMECORTO
Credo che vada bene anche:

Codice: Seleziona tutto

echo "$PACKAGE" | grep -q "\-[0-9]+[a-z]+"
if [ "$?" == 0 ]; then
          echo NOMECOMPLETO
else
          echo NOMECORTO
Offtopic: Maledette regex :?

Re: [BASH] Riconoscere nome completo da nome corto

Inviato: ven 19 feb 2010, 16:30
da Paoletta
Ansa89 ha scritto:
Paoletta ha scritto:

Codice: Seleziona tutto

echo "$PACKAGE" | grep -q "\-[0-9][0-9]*[a-z][a-z]*"
if [ "$?" == 0 ]; then
          echo NOMECOMPLETO
else
          echo NOMECORTO
Credo che vada bene anche:

Codice: Seleziona tutto

echo "$PACKAGE" | grep -q "\-[0-9]+[a-z]+"
if [ "$?" == 0 ]; then
          echo NOMECOMPLETO
else
          echo NOMECORTO
Offtopic: Maledette regex :?
no non vanno bene né la mia né la tua..la mia matcha con -3g (ad esempio) e non è bello, la tua non va...a questo punto meglio controllare i punti come dice ulisse, oppure assumere che i nomi degli autori siano contraddistinti da almeno 2 lettere (che di solito succede) e verrebbe:

Codice: Seleziona tutto

echo "$PACKAGE" | grep -q "\-[0-9][0-9]*[a-z][a-z][a-z]*"
if [ "$?" == 0 ]; then
          echo NOMECOMPLETO
else
          echo NOMECORTO

Re: [BASH] Riconoscere nome completo da nome corto

Inviato: ven 19 feb 2010, 16:46
da proffi
Paoletta, la tua regex non va bene perché in [0-9][0-9]*[a-z][a-z]* c'è questo problema:

-il primo [0-9] verifica un numero, ad esempio il 3 di ntfs-3g
-il secondo [0-9]* verifica un numero qualsiasi di cifre, anche nessuna, quindi ntfs-3g è ancora verificato
-stesso funzionamento per [a-z][a-z]*

La regex che ho scritto io nella prima risposta funziona, almeno per ntfs-3g... poi ulteriori test non fanno male di sicuro!
Offtopic: Maledette regex :?
Ma noooooooooooo :-) sono la cosa più utile e potente nello scripting ;-) fanno solo arrabbiare un po' all'inizio!

Ciao ciao

Re: [BASH] Riconoscere nome completo da nome corto

Inviato: ven 19 feb 2010, 16:50
da d4z_c0nf
Anche una cosa del genere,

Codice: Seleziona tutto

echo "$PACKAGE" egrep -q "^.*\-.+\-[0-9]+[a-z]+$"
if [ "$?" == 0 ]; then
          echo NOMECOMPLETO
else
          echo NOMECORTO
anche se non proprio pulitissima, nel senso che, se gli dai in pasto solo nomi di pacchetti (corti o lunghi) allora credo funzioni, altrimenti potrebbe matchare altre "frasi" non essendo molto specifica.

Re: [BASH] Riconoscere nome completo da nome corto

Inviato: ven 19 feb 2010, 16:53
da Ansa89
Paoletta ha scritto:la tua non va...
Strano, dal man di grep:
man grep ha scritto:+ The preceding item will be matched one or more times.
Dovrebbe essere quello che cercavi di esprimere tu (prima della correzione).

Re: [BASH] Riconoscere nome completo da nome corto

Inviato: ven 19 feb 2010, 17:04
da Paoletta
proffi ha scritto:Paoletta, la tua regex non va bene perché in [0-9][0-9]*[a-z][a-z]* c'è questo problema:

-il primo [0-9] verifica un numero, ad esempio il 3 di ntfs-3g
-il secondo [0-9]* verifica un numero qualsiasi di cifre, anche nessuna, quindi ntfs-3g è ancora verificato
-stesso funzionamento per [a-z][a-z]*

La regex che ho scritto io nella prima risposta funziona, almeno per ntfs-3g... poi ulteriori test non fanno male di sicuro!
Offtopic: Maledette regex :?
Ma noooooooooooo :-) sono la cosa più utile e potente nello scripting ;-) fanno solo arrabbiare un po' all'inizio!

Ciao ciao
confermo, ora con la correzione -3g non matcha più;

Re: [BASH] Riconoscere nome completo da nome corto

Inviato: ven 19 feb 2010, 17:05
da Paoletta
Ansa89 ha scritto:
Paoletta ha scritto:la tua non va...
Strano, dal man di grep:
man grep ha scritto:+ The preceding item will be matched one or more times.
Dovrebbe essere quello che cercavi di esprimere tu (prima della correzione).
infatti non me lo spiego...

Re: [BASH] Riconoscere nome completo da nome corto

Inviato: ven 19 feb 2010, 17:14
da d4z_c0nf
Paoletta ha scritto:
Ansa89 ha scritto:
Paoletta ha scritto:la tua non va...
Strano, dal man di grep:
man grep ha scritto:+ The preceding item will be matched one or more times.
Dovrebbe essere quello che cercavi di esprimere tu (prima della correzione).
infatti non me lo spiego...
Sì ma le due espressioni sono equivalenti.
+ = 1 o più occorrenze del pattern.
* = 0 o più occerrenze del pattern.

Per esempio io nella mia, che include la vostra soluzione, ho usato la versione che usa Ansa89, perchè oltre ad essere più compatta è tecnicamente più corretta.

"+" è sicuramente incluso nelle extended reg ex e non nelle base. Di "*" non sono sicuro, ma a questo punto immagino che stia anche nelle base, così per far funzionare "+" devi usare grep -e, o egrep.
rock

Re: [BASH] Riconoscere nome completo da nome corto

Inviato: ven 19 feb 2010, 17:46
da Paoletta
d4z_c0nf ha scritto:
"+" è sicuramente incluso nelle extended reg ex e non nelle base. Di "*" non sono sicuro, ma a questo punto immagino che stia anche nelle base, così per far funzionare "+" devi usare grep -e, o egrep.
rock
ecco qual era il problema! Con egrep funziona, grazie 1000

Re: [BASH] Riconoscere nome completo da nome corto

Inviato: ven 19 feb 2010, 17:47
da d4z_c0nf
Paoletta ha scritto:
d4z_c0nf ha scritto:
"+" è sicuramente incluso nelle extended reg ex e non nelle base. Di "*" non sono sicuro, ma a questo punto immagino che stia anche nelle base, così per far funzionare "+" devi usare grep -e, o egrep.
rock
ecco qual era il problema! Con egrep funziona, grazie 1000
You're welcome!

Re: [BASH] Riconoscere nome completo da nome corto

Inviato: ven 19 feb 2010, 18:04
da 414N
Perché non sfruttare il nome del pacchetto contenuto nello slack-desc all'interno dello stesso?
È già pulito da tutti i fronzoli...
Un esempio;

Codice: Seleziona tutto

DIRTY_NAME=`tar xf package.tgz install/slack-desc -O | egrep  '[:graph:]*: '`
Dovrebbe restituire, a meno di "arruginitura eccessiva" sulla REGEXP, una riga tipo queste (tratte da obconf):

Codice: Seleziona tutto

obconf: obconf (Openbox configuration tool)
obconf: ObConf is a graphical configuration tool for the Openbox
obconf: window manager.
obconf: obconf home: http://icculus.org/openbox/index.php/ObConf:About
Ricavate queste info, una filtrata con cut ed head ed il gioco è fatto:

Codice: Seleziona tutto

NAME=`tar xf package.tgz install/slack-desc -O | egrep  '[:graph:]*: ' | cut -d: -f1 | head -n1`