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

[BASH] Riconoscere nome completo da nome corto

Messaggio 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.

Avatar utente
proffi
Linux 1.x
Linux 1.x
Messaggi: 135
Iscritto il: ven 13 ago 2004, 0:00
Slackware: 13.37
Località: Lunano

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio 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

Avatar utente
ulisse89
Packager
Packager
Messaggi: 643
Iscritto il: sab 17 gen 2009, 12:53
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce
Località: Bologna

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio da ulisse89 »

Ok grazie mille. Appena posso provo e ti faccio sapere.

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio 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

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio 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 :?

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio 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

Avatar utente
proffi
Linux 1.x
Linux 1.x
Messaggi: 135
Iscritto il: ven 13 ago 2004, 0:00
Slackware: 13.37
Località: Lunano

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio 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

Avatar utente
d4z_c0nf
Packager
Packager
Messaggi: 1296
Iscritto il: mar 14 mar 2006, 18:07
Nome Cognome: Rocco Aliberti
Slackware: 14.2-current64
Kernel: 4.14.73
Desktop: awesomeWM
Località: Pinerolo

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio 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.
Ultima modifica di d4z_c0nf il ven 19 feb 2010, 16:55, modificato 1 volta in totale.

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio 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).

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio 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ù;

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio 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...

Avatar utente
d4z_c0nf
Packager
Packager
Messaggi: 1296
Iscritto il: mar 14 mar 2006, 18:07
Nome Cognome: Rocco Aliberti
Slackware: 14.2-current64
Kernel: 4.14.73
Desktop: awesomeWM
Località: Pinerolo

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio 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

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio 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

Avatar utente
d4z_c0nf
Packager
Packager
Messaggi: 1296
Iscritto il: mar 14 mar 2006, 18:07
Nome Cognome: Rocco Aliberti
Slackware: 14.2-current64
Kernel: 4.14.73
Desktop: awesomeWM
Località: Pinerolo

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio 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!

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio 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`

Rispondi