Repository 32bit  Forum
Repository 64bit  Wiki

[BASH] Riconoscere nome completo da nome corto

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

[BASH] Riconoscere nome completo da nome corto

Messaggioda ulisse89 » ven feb 19, 2010 14:57

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.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: [BASH] Riconoscere nome completo da nome corto

Messaggioda proffi » ven feb 19, 2010 15:37

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
Avatar utente
proffi
Linux 2.0
Linux 2.0
 
Messaggi: 135
Iscritto il: gio ago 12, 2004 23:00
Località: Lunano
Slackware: 13.37

Re: [BASH] Riconoscere nome completo da nome corto

Messaggioda ulisse89 » ven feb 19, 2010 15:42

Ok grazie mille. Appena posso provo e ti faccio sapere.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: [BASH] Riconoscere nome completo da nome corto

Messaggioda Paoletta » ven feb 19, 2010 16:18

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
Avatar utente
Paoletta
Staff
Staff
 
Messaggi: 3899
Iscritto il: dom apr 24, 2005 23:00
Località: Varese
Slackware: 13.1
Desktop: fluxbox

Re: [BASH] Riconoscere nome completo da nome corto

Messaggioda Ansa89 » ven feb 19, 2010 16:23

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 :?
Avatar utente
Ansa89
Iper Master
Iper Master
 
Messaggi: 2621
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1

Re: [BASH] Riconoscere nome completo da nome corto

Messaggioda Paoletta » ven feb 19, 2010 16:30

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
Avatar utente
Paoletta
Staff
Staff
 
Messaggi: 3899
Iscritto il: dom apr 24, 2005 23:00
Località: Varese
Slackware: 13.1
Desktop: fluxbox

Re: [BASH] Riconoscere nome completo da nome corto

Messaggioda proffi » ven feb 19, 2010 16:46

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
Avatar utente
proffi
Linux 2.0
Linux 2.0
 
Messaggi: 135
Iscritto il: gio ago 12, 2004 23:00
Località: Lunano
Slackware: 13.37

Re: [BASH] Riconoscere nome completo da nome corto

Messaggioda d4z_c0nf » ven feb 19, 2010 16:50

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.
Ultima modifica di d4z_c0nf il ven feb 19, 2010 16:55, modificato 1 volta in totale.
Avatar utente
d4z_c0nf
Packager
Packager
 
Messaggi: 1293
Iscritto il: mar mar 14, 2006 18:07
Località: Salerno
Nome Cognome: Rocco Aliberti
Slackware: 14.1-64bit
Kernel: 3.10.17
Desktop: xfce

Re: [BASH] Riconoscere nome completo da nome corto

Messaggioda Ansa89 » ven feb 19, 2010 16:53

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).
Avatar utente
Ansa89
Iper Master
Iper Master
 
Messaggi: 2621
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1

Re: [BASH] Riconoscere nome completo da nome corto

Messaggioda Paoletta » ven feb 19, 2010 17:04

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ù;
Avatar utente
Paoletta
Staff
Staff
 
Messaggi: 3899
Iscritto il: dom apr 24, 2005 23:00
Località: Varese
Slackware: 13.1
Desktop: fluxbox

Re: [BASH] Riconoscere nome completo da nome corto

Messaggioda Paoletta » ven feb 19, 2010 17:05

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...
Avatar utente
Paoletta
Staff
Staff
 
Messaggi: 3899
Iscritto il: dom apr 24, 2005 23:00
Località: Varese
Slackware: 13.1
Desktop: fluxbox

Re: [BASH] Riconoscere nome completo da nome corto

Messaggioda d4z_c0nf » ven feb 19, 2010 17:14

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
Avatar utente
d4z_c0nf
Packager
Packager
 
Messaggi: 1293
Iscritto il: mar mar 14, 2006 18:07
Località: Salerno
Nome Cognome: Rocco Aliberti
Slackware: 14.1-64bit
Kernel: 3.10.17
Desktop: xfce

Re: [BASH] Riconoscere nome completo da nome corto

Messaggioda Paoletta » ven feb 19, 2010 17:46

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
Avatar utente
Paoletta
Staff
Staff
 
Messaggi: 3899
Iscritto il: dom apr 24, 2005 23:00
Località: Varese
Slackware: 13.1
Desktop: fluxbox

Re: [BASH] Riconoscere nome completo da nome corto

Messaggioda d4z_c0nf » ven feb 19, 2010 17:47

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!
Avatar utente
d4z_c0nf
Packager
Packager
 
Messaggi: 1293
Iscritto il: mar mar 14, 2006 18:07
Località: Salerno
Nome Cognome: Rocco Aliberti
Slackware: 14.1-64bit
Kernel: 3.10.17
Desktop: xfce

Re: [BASH] Riconoscere nome completo da nome corto

Messaggioda 414N » ven feb 19, 2010 18:04

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`
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2881
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti