[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

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio da ulisse89 »

in realtà ce ne sono altre
s390 e arm sono due "ufficiali" per esempio
Potrei basarmi su una lista di tutte quelle possibili. Dove potrei reperirle?

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio da conraid »

ulisse89 ha scritto:
in realtà ce ne sono altre
s390 e arm sono due "ufficiali" per esempio
Potrei basarmi su una lista di tutte quelle possibili. Dove potrei reperirle?
boh

naturalmente se ti basi sui porting ufficiali di slackware allora sono quelle menzionate prima, più s390 e arm
se poi vuoi che il tuo script funzioni anche in distribuzioni non ufficiali, che ne so tipo slamd64, allora devi vedere ogni distribuzione cosa utilizza

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 »

conraid ha scritto:in realtà ce ne sono altre
s390 e arm sono due "ufficiali" per esempio
Sì ma siccome sono specifiche per l'architettura, potresti metterle in una variabile.
Nel senso se tu usi una i*86 di sicuro non avrai pacchetti del tipo x86_64 o arm, puoi però avere noarch.
Poi se magari cambi architettura e vuoi portarti con te lo script cambi solo la variabile.
Una variabile del tipo ARCH="i.86|noarch", ad esempio.
Volendo potresti avere una versione che abbia un numero di release maggiore di 9, allora a quel punto aumentando le cifre
[0-9] diventa [0-9]+.

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 »

Sì, potrei fare una variabile che rappresenta l'architettura.
Per la questione del numero di release che può essere maggiore di 9 ho notato che :

Codice: Seleziona tutto

echo "ciao-2-i686-13" | egrep "\-(i.86|noarch|x86_64)-[0-9].*$"
matcha, anche se non dovrebbe.
Infatti la parte "-[0-9].*$" vuol dire che cerca dopo il trattino finale, una sola cifra da 0 a 9 e un set di caratteri di qualsiasi dimensione fino alla fine.

EDIT: Ho capito: al posto del punto che matcha tutti i caratteri comprese le cifre dovrei mettere un [a-z]. Verrebbe:

Codice: Seleziona tutto

echo "ciao-2-i686-13" | egrep "\-(i.86|noarch|x86_64)-[0-9]+[a-z]*$"
Giusto?

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 »

ulisse89 ha scritto:Sì, potrei fare una variabile che rappresenta l'architettura.
Per la questione del numero di release che può essere maggiore di 9 ho notato che :

Codice: Seleziona tutto

echo "ciao-2-i686-13" | egrep "\-(i.86|noarch|x86_64)-[0-9].*$"
matcha, anche se non dovrebbe.
Infatti la parte "-[0-9].*$" vuol dire che cerca dopo il trattino finale, una sola cifra da 0 a 9 e un set di caratteri di qualsiasi dimensione fino alla fine.

EDIT: Ho capito: al posto del punto che matcha tutti i caratteri comprese le cifre dovrei mettere un [a-z]. Verrebbe:

Codice: Seleziona tutto

echo "ciao-2-i686-13" | egrep "\-(i.86|noarch|x86_64)-[0-9]+[a-z]*$"
Giusto?
Giusto. Ma se ci pensi anche inutile, perchè in quel caso che ci sia +[a-z]* o solo .*, visto quello che ti serve, è uguale.
Io prima intendevo, sbagliando perchè funzionava comunque, una maggiore "coerenza" della reg-ex.

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 »

@d4z_c0nf :
Se metto ".*" allora matcha anche se viene passato il nome corto "qwerty-noarch-sl". Lo so che è surreale che un programma abbia "noarch" come parte del nome, ma è teoricamente possibile.
In questo caso il nome del pacchetto è passato in forma breve (cioè solo il nome del programma), mentre viene riconosciuto come nome completo.
Sempre sotto questo punto di vista anche "\-(i.86|noarch|x86_64)-[0-9]+[a-z]*$" non va bene. Supponendo che un pacchetto si chiami "ntfs-noarch-3g", passa come nome completo.

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 »

ulisse89 ha scritto:@d4z_c0nf :
Se metto ".*" allora matcha anche se viene passato il nome corto "qwerty-noarch-sl". Lo so che è surreale che un programma abbia "noarch" come parte del nome, ma è teoricamente possibile.
In questo caso il nome del pacchetto è passato in forma breve (cioè solo il nome del programma), mentre viene riconosciuto come nome completo.
No aspè intendevo, da qui:
"-[0-9]+[a-z]*$"
se metti .* al posto di +[a-z]*
Non matcha quella stringa che hai detto.
Al massimo può matchare qualcosa del tipo qwerty-noarch-1sl, nel caso esistesse.

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 »

Sì diciamo che ho risolto. Nel caso in cui qualche programmatore sviluppi il software "ntfs-noarch-3g", lo vado a prendere a casa. :evil:
Comunque la soluzione trovata va più che bene, grazie a tutti.
Se qualcuno avesse un lampo di genio per qualcosa di più universale e preciso, si faccia avanti.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6628
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio da targzeta »

Visti gli esempi che riportate, la soluzione proposta nel thread che hai scovato secondo me potrebbe funzionare, con qualche modifica. O ancora non ho capito cosa chiedi?

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

albatrosla
Packager
Packager
Messaggi: 1339
Iscritto il: sab 27 mar 2004, 0:00
Slackware: current
Desktop: fluxbox.git
Località: Collegno, but made in Friûl
Contatta:

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio da albatrosla »

Ulisse89, la mia soluzione non ti piace? Isola il solo nome, qualsiasi sia la sua "lunghezza" o il suo "frazionamento", e non fa troppo lo schizzinoso con le arch e le revisioni. Guardandola la correggo in:

Codice: Seleziona tutto

echo nome_package | sed "s/\(-[^-]\{1,\}\)\{3\}$//"
Più corretta. In pratica cancella dalla stringa gli ultimi tre campi separati da "-" e costituiti da caratteri che non siano "-". Funziona qualsiasi sia il nome del package. Provare per credere:

Codice: Seleziona tutto

echo ntfs-3g-extreme-score-number-into-program-name-2009.4.4-i486-1|sed "s/\(-[^-]\{1,\}\)\{3\}$//"

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio da conraid »

@spina
@albatrosla

secondo me lui non cerca quello, nel senso che non cerca di trovare il nome dato il pacchetto

mi spiego
lui non ha
ntfs-3g-extreme-score-number-into-program-name-2009.4.4-i486-1
da cui ricavare
ntfs-3g-extreme-score

lui ha per esempio
ntfs-3g-extreme-score
e vuole sapere se è completo o no
come fareste con questo metodo?

se poi ho capito male io, i'm sorry

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6628
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio da targzeta »

Ecco, albatrosla ha fatto quello che intendevo io. Secondo me è il miglior modo per ottenere quello che si vuole. Ovviamente se sed non modifica la stringa in input allora il nome non è completo :).

Questo ad esempio dovrebbe andar bene:

Codice: Seleziona tutto

[ $PACKAGE = $(echo $PACKAGE | sed "s/\(-[^-]\{1,\}\)\{3\}$//") ] && echo  NOMECORTO || echo NOMECOMPLETO
Nota che in questo modo, se PACKAGE si riferisce ad un pacchetto, l'output di sed è proprio il nome del pacchetto, due piccioni con una fava,
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

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 »

spina ha scritto:Ecco, albatrosla ha fatto quello che intendevo io. Secondo me è il miglior modo per ottenere quello che si vuole. Ovviamente se sed non modifica la stringa in input allora il nome non è completo :).

Questo ad esempio dovrebbe andar bene:

Codice: Seleziona tutto

[ $PACKAGE = $(echo $PACKAGE | sed "s/\(-[^-]\{1,\}\)\{3\}$//") ] && echo  NOMECORTO || echo NOMECOMPLETO
Nota che in questo modo, se PACKAGE si riferisce ad un pacchetto, l'output di sed è proprio il nome del pacchetto, due piccioni con una fava,
Emanuele
L'unica cosa che voglio dire è.. ma perchè non usare le extended (opzione "-r" di sed) così da eliminare tutti quegli escape che rendono faticosa l'intepretazione umana dell'espressione? :D

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 »

@ spina a albatrosla: la vostra soluzione mi era sfuggita, scusate.
Però l'ho provata e non funziona. Premettendo che quello che mi serve è quello che ha detto conraid, faccio qualche esempio, prendendo come riferimento la:

Codice: Seleziona tutto

[ $PACKAGE = $(echo $PACKAGE | sed "s/\(-[^-]\{1,\}\)\{3\}$//") ] && echo  NOMECORTO || echo NOMECOMPLETO
Con PACKAGE="ntfs-3g-extreme-score-number-into-program-name-2009.4.4-i486-1" --> NOMECOMPLETO (e va bene)
Con PACKAGE="ntfs-3g-extreme-score-number-into-program-name" --> NOMECOMPLETO (e non va bene).

In pratica la vostra soluzione tratta come nome completo ogni nome di pacchetto che ha più di tre "-". Ma un nome di un software può avere anche più di 3 "-".

Per ricavare il nome di un programma dal nome completo del pacchetto, la vostra soluzione è perfetta, infatti me tengo da parte perchè sicuramente mi servirà.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6628
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [BASH] Riconoscere nome completo da nome corto

Messaggio da targzeta »

Anche tu non hai tutti i torti. Allora devi raffinare lo script inserendoci altre caratteristiche tipiche di un pacchetto slackware. Ecco un esempio:

Codice: Seleziona tutto

#!/bin/bash
# by Spina
#
# $1 = Nome da controllare

_ARCH='..\?86 noarch'

for arch in $_ARCH
do
    PGRNAME=$(echo $1 | sed "s/-[^-]*-${arch}[^-]*-[0-9][^-]*$//")
    if [ $PGRNAME != $1 ]
    then 
        echo "Nome completo per $PGRNAME"
        exit
    fi
done

echo "Nome corto"
Emanuele

P.S. Nota che c'è un 'exit', quindi invoca lo script con 'sh nomescript' se non vuoi che l'exit uccida la shell corrente :)
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Rispondi