# [portage]Come ricavare il nome del pacchetto senza versione?

## Cazzantonio

Probabilmente chi di voi si diletta di bash scripting per genstire le varie eventuali del proprio sistema si è scontrato una o più volte con questo problema annoso:

Come ricavare il nome del pacchetto eliminando la versione?   :Confused: 

Faccio un esempio per essere più chiaro:

se ho un pacchetto del tipo

<categoria>/<nome>-<versione> come faccio con un semplice script a ricavarmi <categoria>/<nome> e basta?   :Confused: 

Sembra semplice a dirsi ma se <categoria> è sicuramente più standard come formato, <nome> può essere lungo a piacere e non è ben chiaro come separarlo dalla <versione> con un semplice "cut"   :Rolling Eyes: 

Se uno di voi risolve questo problema gli offro una birra appena passa dalle mie parti   :Very Happy: 

Io per ora ho trovato solo questa soluzione estremamente poco elegante:

```
PIPPO=1

while [ `echo "app-admin/eselect-opengl-1.5.6-r1"|cut -d"-" -f$PIPPO |sort|uniq |grep "\."|wc -l` -eq 0 ]

do

PIPPO=$(echo "$PIPPO +1" |bc)

done

PIPPO=$(echo $PIPPO -1|bc)

echo "app-admin/eselect-opengl-1.5.6-r1" |cut -d"-" -f-$PIPPO
```

ovviamente app-admin/eselect-opengl-1.5.6-r1 è solo un esempio   :Smile: 

----------

## codadilupo

```
harlock@Alkadia ~ $ echo "gnome-extra/gnome-power-manager-2.14.2" | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1

gnome-extra/gnome-power-manager

harlock@Alkadia ~ $
```

puo' andare ?

Coda

----------

## shogun_panda

 *Cazzantonio wrote:*   

> Probabilmente chi di voi si diletta di bash scripting per genstire le varie eventuali del proprio sistema si è scontrato una o più volte con questo problema annoso:
> 
> Come ricavare il nome del pacchetto eliminando la versione?  
> 
> 

 

 *codadilupo wrote:*   

> 
> 
> puo' andare ?
> 
> 

 

Nel tuo caso, temo funzioni solo con numeri di versione standard. Ma non so se tutti i numeri di versione sono numerici.

Io ci ho provato ma in Python sfruttando il path dell'ebuild tramite equery. 

La cosa buona è che gli serve solo Python (ed in gentoo non puoi NON averlo  :Very Happy: ) ed equery (contenuto in gentoolkit).

L'utilizzo è semplice: ./finder.py $PACCHETTO $ROOT

dove $PACCHETTO è il nome del pacchetto...Con o senza versione è indifferente, l'importante è che sia in una sintassi accettata da equery. (anche perchè l'ho scritto in 10 minuti mentre seguivo una lezione all'Uni  :Very Happy: , quindi non c'è error checking).

$ROOT invece deve essere la root reale di portage (cioè senza link simbolici). Per default è /usr/portage, ma non è così in generale (come per me  :Very Happy: ) specie in caso di overlays.

Finalmente, ecco il codice. Spero funzioni....

```

#!/usr/bin/env python

import os

import sys

#SET THERE THE PORTAGE ROOT OR OVERRIDE WITH THE SECOND CMD LINE ARGUMENT. END WITH A /

PORTAGE_ROOT=u'/usr/portage/'

#CHECK PASSED ARGUMENTS

if len(sys.argv) == 1:

   print u'Usage: %s cat/pkg-ver' % sys.argv[0]

   sys.exit(0)

#IF THE ROOT IS OVERRIDDEN

if len(sys.argv) == 3:

   PORTAGE_ROOT = sys.argv[2]

#ADD A / IF NEEDED

if PORTAGE_ROOT[-1] != u'/':

   PORTAGE_ROOT += u'/'

#GET THE FULL EBUILD

fobj = None

if sys.argv[1][0] not in (u'=', u'>', u'<'):

   fobj = os.popen(u'equery which =%s' % sys.argv[1])

else:

   fobj = os.popen(u'equery which \\%s' % sys.argv[1])

ebuild = fobj.read()

fobj.close()

#GET CAT AND NAME

ebuild = ebuild.replace(PORTAGE_ROOT, u'')

#final[0] WILL BE THE CATEGORY, final[1] THE NAME

final = ebuild.split(u'/')[0:2]

#SIMPLY PRINT

print u'%s/%s' % (final[0], final[1])

```

 *Cazzantonio wrote:*   

> 
> 
> Se uno di voi risolve questo problema gli offro una birra appena passa dalle mie parti  
> 
> 

 

CI CONTO!  :Laughing: 

----------

## Cazzantonio

ecco la mia soluzione barbara non funzionava (ovviamente) con nomi tipo app-misc/ca-certificates-20050804 che hano il numero di versione completamente alfanumerico senza punti   :Smile: 

ora leggo i vostri due post... aspe un attimo   :Wink: 

[EDIT1]

@coda

la tua soluzione funziona anche con pacchetti tipo app-misc/ca-certificates-20050804 che piantano il mio ciclo while...

Siccome non conosco esattamente sed (sed è un macello da imparare   :Smile:  ) non capisco perché non dovrebbe funzionare con caratteri particolari...

[/EDIT1]

[EDIT2]

@shogun_panda

Anche il tuo script in python funziona... dici che è più generale rispetto alla riga di sed di coda?

Devo offrire una birra ad entrambi?   :Shocked:   :Very Happy:   :Laughing: 

Comunque tutto questo nasce dal fatto che equery depends talvolta (spesso) non da un risultato utile se invocato come equery depends <cat>/<pkg>-<ver> ma solo come equery depends <cat>/<pkg> (penso sia un bug   :Rolling Eyes:  )

[/EDIT2]

----------

## Kernel78

se uno ha eix installato può anche fare così

```
eix -e qt | grep -E '^\*' | cut -f 2 -d " "
```

----------

## Cazzantonio

 *Kernel78 wrote:*   

> se uno ha eix installato può anche fare così
> 
> ```
> eix -e qt | grep -E '^\*' | cut -f 2 -d " "
> ```
> ...

 

no perché eix non accetta come input il numero della versione...

solo dall'ultima relase mi pare accetti <cat>/<pkg>... prima accettava solo <pkg> come input   :Wink: 

se fai una ricerca 

```
eix -e qt-4.1.2 | grep -E '^\*' | cut -f 2 -d " "
```

 lo vedi subito   :Wink: 

Comunque grazie per aver partecipato al concorso "Passa da Firenze e vinci una birra"  :Very Happy:   :Laughing:   :Laughing: 

[EDIT] ho fatto prove con tutti i pacchetti da me installati e le soluzioni di coda e di panda funzionano bene entrambe   :Very Happy: 

Siccome però a parità di risultato quella di coda è estremamente più elegante (solo una riga di codice   :Wink:  ) direi che merita una birra grande mentre a panda ne offrirò una piccola per il secondo posto  :Very Happy: 

----------

## Kernel78

 :Laughing: 

scusate tutti ma sono troppo rimbambito, sto facendo una settimana di straordinari e mi tocca lavorare anche domattina o mi obbligano a rimandare le ferie , insomma sono stressato e non avevo capito un cavolo della tua richiesta  :Embarassed: 

----------

## shogun_panda

 *Cazzantonio wrote:*   

> 
> 
> Comunque grazie per aver partecipato al concorso "Passa da Firenze e vinci una birra"   
> 
> 

 

 *Cazzantonio wrote:*   

> 
> 
> [EDIT] ho fatto prove con tutti i pacchetti da me installati e le soluzioni di coda e di panda funzionano bene entrambe  
> 
> Siccome però a parità di risultato quella di coda è estremamente più elegante (solo una riga di codice   ) 
> ...

 

Ca**o ho perso!   :Shocked:   :Mad: 

Vabbè...col grande coda me lo posso pure permettere...  :Very Happy: 

Cmq avevo pensato anche io alla soluzione di coda...Il problema è che ci sono alcuni pacchetti con cui non funziona. Sono quelli che usano le lettere anche per il numero di versione...SO che ci sono, ma non saprei dirvi quali...

 *Cazzantonio wrote:*   

> 
> 
> direi che merita una birra grande mentre a panda ne offrirò una piccola per il secondo posto 
> 
> 

 

Vabbè...CONTINUO A CONTARCI!  :Very Happy: 

A parte questo, volendo si può anche evitare l'uso di cut:

```

echo "gnome-extra/gnome-power-manager-2.14.2" | sed -e 's/(.+)(-[0-9](.+))/\1/'

```

Però dovreste testarlo...Ora sto sotto Windows...

Ciao ciao!

----------

## salade

 *shogun_panda wrote:*   

> 
> 
> Cmq avevo pensato anche io alla soluzione di coda...Il problema è che ci sono alcuni pacchetti con cui non funziona. Sono quelli che usano le lettere anche per il numero di versione...SO che ci sono, ma non saprei dirvi quali...
> 
> 

 

```

pc30384 ~ # echo "media-video/mplayer-1.0_pre8"| sed -e 's/-[0-9]/*/g' | cut -d"*" -f1

media-video/mplayer

pc30384 ~ # 

```

era questo che intendevi?   :Wink: 

----------

## ProT-0-TypE

un tempo ci avevo provato anche io.. ma c'è sempre qualche problema con pacchetti tipo questo:

```
echo "media-fonts/font-bitstream-100dpi-1.0.0" | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1

media-fonts/font-bitstream
```

----------

## Cazzantonio

 *ProT-0-TypE wrote:*   

> un tempo ci avevo provato anche io.. ma c'è sempre qualche problema con pacchetti tipo questo:
> 
> ```
> echo "media-fonts/font-bitstream-100dpi-1.0.0" | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1
> 
> ...

 

ecco c'era il trucco...   :Smile: 

Posizioni invertite... coda birra piccola e shogun_panda birra grande!   :Very Happy: 

P.S. ve la offro davvero se passare da firenze... potete contarci!   :Very Happy: 

----------

## zolar czakl

A parte problemi di permessi

```
/usr/lib/portage/bin/pkgname media-fonts/font-bitstream-100dpi-1.0.0 | cut  -d" " -f1

media-fonts/font-bitstream-100dpi
```

Oppure con una piccola modifica al programma (non l'originale mi raccomando   :Shocked:   ) si puo' eliminare il cut

```
#!/usr/bin/python

# Copyright 1999-2006 Gentoo Foundation

# Distributed under the terms of the GNU General Public License v2

# $Id: /var/cvsroot/gentoo-src/portage/bin/pkgname,v 1.8 2004/10/04 13:56:50 vapier Exp $

import sys

sys.path = ["/usr/lib/portage/pym"]+sys.path

import portage

a=portage.pkgsplit(sys.argv[1])

if a:

        print a[0]

        sys.exit(0)

else:

        print '!!! Error: package name is invalid.'

        sys.exit(1)
```

----------

## codadilupo

 *zolar czakl wrote:*   

> A parte problemi di permessi
> 
> ```
> /usr/lib/portage/bin/pkgname media-fonts/font-bitstream-100dpi-1.0.0 | cut  -d" " -f1
> 
> ...

 

 :Shocked:   :Laughing:   abbiamo reinventato la ruota!   :Laughing: 

Coda

----------

## shogun_panda

 *Cazzantonio wrote:*   

> 
> 
> Posizioni invertite... coda birra piccola e shogun_panda birra grande!  
> 
> 

 

Yabadabadoo! HIC!  :Shocked:   :Laughing: 

PS: Eh eh....steng 'mbriac' prim' d' bev'!

PPS: Sono molisano, ma si dovrebbe capire, no?  :Very Happy: 

----------

## mouser

Buongiorno a tutti!!!

Sto scrivendo uno script (che presto presenterò al pubblico), che ha bisogno di estrarre i nomi da dei programmi da una lista ottenuta da emerge.

Spiego meglio: io lancio il comando (per esempio):

```
# emerge --pretend kdebluetooth | grep ebuild | awk '{print $4}'

kde-base/kdialog-3.5.5

kde-base/libkonq-3.5.5

kde-base/kfind-3.5.5

kde-base/kdebase-data-3.5.5

kde-base/kicker-3.5.5

kde-base/khotkeys-3.5.5

kde-base/kdesu-3.5.5

kde-base/khelpcenter-3.5.5

kde-base/kcminit-3.5.3

kde-base/kcontrol-3.5.5

dev-libs/cyrus-sasl-2.1.22-r1

dev-libs/dbus-qt3-old-0.70

kde-base/kdebase-kioslaves-3.5.5-r1

kde-base/konqueror-3.5.5

net-wireless/kdebluetooth-1.0_beta1-r2
```

Attualmente passo ogni voce di questa lista ad una regexp che cerca di estrarre il nome del pacchetto; per esempio da "net-wireless/kdebluetooth-1.0_beta1-r2" estrae "net-wireless/kdebluetooth".

Per quello che sono riuscito a fare finora (chiedo scusa anticipatamente ai puristi del sed/awk per le castronerie che avrò fatto  :Rolling Eyes: ) sono arrivato a questa soluzione:

```
# echo kde-base/kdebase-data-3.5.5 | sed -r s/'-([0-9]|\.)*(-r[0-9]+.*)*$'//g | sed -r s/'-([0-9]|\.)*(_p|_pre[0-9]+)*$'//g

kde-base/kdebase-data

# echo kde-base/kicker-3.5.5 | sed -r s/'-([0-9]|\.)*(-r[0-9]+.*)*$'//g | sed -r s/'-([0-9]|\.)*(_p|_pre[0-9]+)*$'//g

kde-base/kicker

# echo net-print/foomatic-db-ppds-20060720 | sed -r s/'-([0-9]|\.)*(-r[0-9]+.*)*$'//g | sed -r s/'-([0-9]|\.)*(_p|_pre[0-9]+)*$'//g

net-print/foomatic-db-ppds
```

che funziona con la maggior parte dei nomi dei pacchetti.

Il problema nasce quando incontro nomi di pacchetti non standard, quali net-wireless/kdebluetooth-1.0_beta1-r2

```
# echo net-wireless/kdebluetooth-1.0_beta1-r2 | sed -r s/'-([0-9]|\.)*(-r[0-9]+.*)*$'//g | sed -r s/'-([0-9]|\.)*(_p|_pre[0-9]+)*$'//g

net-wireless/kdebluetooth-1.0_beta1-r2

#
```

Visto che sono ormai 2 settimane che ci sbatto la testa, non è che qualcuno ha già una regexp che funzione per "tutto" o quasi il portage??

Mi andrebbero bene anche soluzioni alternative, magari usando tool esterni.

Grazie mille

Ciriciao

mouser  :Wink: 

----------

## gioi

Il ragionamento che faccio è:

- voglio che la regexp elimini la "versione".

- la versione inizia sempre con "-" seguito da un numero seguito da un punto seguito da altra roba...

per cui la regexp che userei io è:

```
s/\-\d+\..+//
```

per esempio, ammesso di aver creato un file chiamato lista.txt che contenga i pacchetti con la versione come da tuo esempio io farei:

```
cat lista.txt | perl -p -e 's/\-\d+\..+//'
```

ed eccoti la lista filtrata...

Naturalmente potresti estenderla per eliminare l'output che non ti interessa di emerge -p direttamente con un comando solo...

Ora sono a lavoro e non ho gentoo, quindi non mi ricordo la formattazione precisa, ma stasera quando sono a casa ti do la regexp estesa precisa...

ciao!

PS: io non uso sed e awk causa idiosincrasia da esaurimento nervoso post altrui script-debugging!

----------

## mouser

Prima di tutto.... grazie!

Proverò questa soluzione, anche se preferirei non avere anche perl come dipendenza dello script.... quindi, se qualcuno conosce altre soluzioni od il corrispettivo sed/awk si faccia avanti (comunque farò delle prove per portarmi la sintassi anche li.... non credo di avere grossi problemi)

Ciriciao

mouser  :Wink: 

edit:

Ho appena provato e...... funziona!!!! ora farò un bel pò di prove per vedere se gira con tutto.... nel caso, il perl secondo voi è accettabile come dipendenza?

----------

## gioi

 *mouser wrote:*   

> Prima di tutto.... grazie!
> 
> Proverò questa soluzione, anche se preferirei non avere anche perl come dipendenza dello script.... quindi, se qualcuno conosce altre soluzioni od il corrispettivo sed/awk si faccia avanti (comunque farò delle prove per portarmi la sintassi anche li.... non credo di avere grossi problemi)
> 
> Ciriciao
> ...

 

Ma guarda che se non ricordo male la regexp di cui sopra la puoi usare anche con sed...

----------

## ProT-0-TypE

non c'è bisogno di scomodare le regexp, da qualche parte c'è un eseguibile (che penso faccia parte del package di portage) che fa questo per te. Non sono a casa e non mi ricordo esattamente dove sta, ma se fai un search nel forum dovresti trovare un post dove se ne parla.

----------

## makoomba

```
sed -e 's|\-[[:digit:]].*$||'
```

----------

## ProT-0-TypE

Trovato!

```
/usr/lib/portage/bin/pkgname
```

Se n'era parlato qua

----------

## gioi

 *makoomba wrote:*   

> 
> 
> ```
> sed -e 's|\-[[:digit:]].*$||'
> ```
> ...

 

mmm... in effetti l'utilizzo del "$" per specificare di applicare il filtro solo alla fine della stringa sarebbe la cosa più corretta, ma IMHO è ridondante visto che i pacchetti di solito non contengono nel nome la stringa "-N." (dove N ovviamente è un numero) se non per quanto riguarda la versione...

Non è una critica... sto solo filosofeggiando un po'  :Razz: 

----------

## crisandbea

 *ProT-0-TypE wrote:*   

> Trovato!
> 
> ```
> /usr/lib/portage/bin/pkgname
> ```
> ...

 

non credo faccia al caso di "mouser", per lo scopo che penso raggiungere, e poi mi sembra più semplice il modo che attuo io   :Laughing: 

```

emerge -pvt pacchetto | sed -e 's|\-[[:digit:]].*$||' | grep ebuild | awk '{ print $4}'
```

ciauz

----------

## ProT-0-TypE

 *makoomba wrote:*   

> 
> 
> ```
> sed -e 's|\-[[:digit:]].*$||'
> ```
> ...

 

Con pacchetti tipo questo non funziona:

```
echo font-bitstream-100dpi-1.0.0 | sed -e 's|\-[[:digit:]].*$||'

font-bitstream
```

----------

## ProT-0-TypE

 *crisandbea wrote:*   

>  *ProT-0-TypE wrote:*   Trovato!
> 
> ```
> /usr/lib/portage/bin/pkgname
> ```
> ...

 

Non mi sembra proprio più semplice... comunqe hai provato se per pacchetti tipo font-bitstream-100dpi-1.0.0 funziona?

----------

## mouser

 *ProT-0-TypE wrote:*   

> Con pacchetti tipo questo non funziona:
> 
> ```
> echo font-bitstream-100dpi-1.0.0 | sed -e 's|\-[[:digit:]].*$||'
> 
> ...

 

Però quello in perl va..... hmmm mi sa che alla fine utilizzerò quello.... tra l'altro noto che nonostante utilizzi il perl l'esecuzione è praticamente immediata

Ciauz

mouser  :Wink: 

edit:

NOOOOO   :Crying or Very sad:   :Crying or Very sad:   :Crying or Very sad:   :Crying or Very sad: 

 *ProT-0-TypE wrote:*   

> Se ne era parlato qua

 

Possibile??? Apro un thread ogni morte di papa.... ed è pure duplicato!!!!

Mi sto mobilitando per sostituire la sedia con uno sgabello di chiodi   :Embarassed:   :Embarassed: 

----------

## makoomba

 *ProT-0-TypE wrote:*   

> Con pacchetti tipo questo non funziona:
> 
> ```
> echo font-bitstream-100dpi-1.0.0 | sed -e 's|\-[[:digit:]].*$||'
> 
> ...

 

vedo il tuo font-bitstream e rilancio con

```
echo font-bitstream-100dpi-1.0.0 | sed -e 's|\-[[:digit:]]*\..*$||'

font-bitstream-100dpi
```

edit:

fatto il merge dei due topic

----------

## ProT-0-TypE

```
echo vimap-2002c-r3 | perl -p -e 's/\-\d+\..+//'

vimap-2002c-r3
```

```
echo vimap-2002c-r3 | sed -e 's|\-[[:digit:]]*\..*$||' 

vimap-2002c-r3
```

c'è sempre qualche pacchetto che da problemi   :Exclamation: 

----------

## crisandbea

 *ProT-0-TypE wrote:*   

> 
> 
> Non mi sembra proprio più semplice... comunqe hai provato se per pacchetti tipo font-bitstream-100dpi-1.0.0 funziona?

 

beh basta aggiungere un . 

```

emerge -pvt font-bitstream-100dpi| sed -e 's|\-[[:digit:]]..*$||' | grep ebuild | awk '{ print $4}'

```

ciauz

----------

## ProT-0-TypE

che fai copi makoomba?   :Laughing: 

Comunqe prova con vimap-2002c-r3 (che era un altro dei pacchetti che creavano problemi). 

(non sono a casa e non posso provare)

----------

## makoomba

 *ProT-0-TypE wrote:*   

> che fai copi makoomba?

 

prr! non avevo letto l'altro post....

[TODO]

trovare quanto prima scusa per appioppare ban a ProT-0-TypE

[/TODO]

----------

## ProT-0-TypE

 *makoomba wrote:*   

>  *ProT-0-TypE wrote:*   che fai copi makoomba? 
> 
> prr! non avevo letto l'altro post....
> 
> [TODO]
> ...

 

ahahahahah  :Razz: 

----------

## makoomba

sed the 3rd

```
cat ebuilds | sed -re 's|-[0-9]+[^-]+(-r[0-9])?$||'

font-bitstream-100dpi

vimap

```

----------

## gioi

 *makoomba wrote:*   

> sed the 3rd
> 
> ```
> cat ebuilds | sed -re 's|-[0-9]+[^-]+(-r[0-9])?$||'
> 
> ...

 

ma scusate a questo punto il

```
perl -p -e 's/\-\d\..+//'
```

 da dare in pasto ad una pipe cos'ha che non va?

- funziona anche con i pacchetti tipo font-bitstrema-100dpi

- è semplice e compatto

----------

## Kernel78

 *gioi wrote:*   

> ma scusate a questo punto il
> 
> ```
> perl -p -e 's/\-\d\..+//'
> ```
> ...

 

Non funziona con numeri di versione tipo app-emulation/wine-20050930

----------

## ProT-0-TypE

 *gioi wrote:*   

>  *makoomba wrote:*   sed the 3rd
> 
> ```
> cat ebuilds | sed -re 's|-[0-9]+[^-]+(-r[0-9])?$||'
> 
> ...

 

si ma con pacchetti tipo vimap non funziona:

```
echo vimap-2002c-r3 |perl -p -e 's/\-\d\..+//'

vimap-2002c-r3
```

----------

## ProT-0-TypE

 *makoomba wrote:*   

> sed the 3rd
> 
> ```
> cat ebuilds | sed -re 's|-[0-9]+[^-]+(-r[0-9])?$||'
> 
> ...

 

questo è duro da battere   :Laughing: 

EDIT: 

```
echo ilbc-rfc3951-0-r1 | sed -re 's|-[0-9]+[^-]+(-r[0-9])?$||'

ilbc-rfc3951-0-r1
```

----------

## mouser

 *ProT-0-TypE wrote:*   

> questo è duro da battere  
> 
> EDIT: 
> 
> ```
> ...

 

Cribbio, ma ci sarà pure qualche modo che funzia con tutto!!!  :Evil or Very Mad: 

E' così infame portage???

Ciriciao

mouser  :Wink: 

----------

## makoomba

 *ProT-0-TypE wrote:*   

> 
> 
> ```
> echo ilbc-rfc3951-0-r1 | sed -re 's|-[0-9]+[^-]+(-r[0-9])?$||'
> 
> ...

 

tiè

```
[root@backup root]# cat ebuilds  | sed -re 's|-[0-9]+[^-]*(-r[0-9])?$||'

font-bitstream-100dpi

vimap

ilbc-rfc3951

```

----------

## Scen

A me sembra che la soluzione tramite il binario pkgname incluso in Portage funziona a dovere!  :Cool: 

```

/usr/lib/portage/bin/pkgname <category>/<pkg-name>-<pkg-version> | awk {'print $1'}

```

Esempi:

```

# /usr/lib/portage/bin/pkgname dev-libs/ilbc-rfc3951-0-r1 | awk {'print $1'}

dev-libs/ilbc-rfc3951

# /usr/lib/portage/bin/pkgname vimap-2002c-r3 | awk {'print $1'}

vimap

# /usr/lib/portage/bin/pkgname font-bitstream-100dpi-1.0.0  | awk {'print $1'}

font-bitstream-100dpi

# /usr/lib/portage/bin/pkgname wine-20050930  | awk {'print $1'}

wine

```

----------

## ProT-0-TypE

 *Scen wrote:*   

> A me sembra che la soluzione tramite il binario pkgname incluso in Portage funziona a dovere! 
> 
> ```
> 
> /usr/lib/portage/bin/pkgname <category>/<pkg-name>-<pkg-version> | awk {'print $1'}
> ...

 

si l'avevo già scritto su...   :Cool: 

stavolta mi sa che makoomba mi ha battuto..  :Razz: 

----------

## cloc3

 *mouser wrote:*   

> 
> 
> Cribbio, ma ci sarà pure qualche modo che funzia con tutto!!! 
> 
> 

 

per me, sicuramente no.

In portage esistono decine di migliaia di pacchetti.

I più assumono denominazioni che  rispettano una ben precisa sintassi. Altri se ne distaccano a causa di ragioni incidentali che non dipendono da gentoo, ma da questioni esterne. Una distribuzione usa software di altri, e non può determinare i nomi.

L'unica è definire una regola di massima e organizzare un database delle eccezioni, come fossero verbi irregolari.

----------

## gioi

 *ProT-0-TypE wrote:*   

>  *gioi wrote:*    *makoomba wrote:*   sed the 3rd
> 
> ```
> cat ebuilds | sed -re 's|-[0-9]+[^-]+(-r[0-9])?$||'
> 
> ...

 

Prima cosa: mi sono scordato il "+" dopo il "\d" la stringa esatta (come da originale) è:

```
s/\-\d+\..+//
```

Capisco il problema... ma quelli più che versioni vere e proprie dovrebbero essere degli snapshot... 

Cmq basta modificarla aggiungendo due caratteri e sostituendone 1:

```
s/\-\d+\.?.*$//
```

Così va meglio?

----------

## gioi

[OT]

So che a molti sembrerà una minkiata, ma secondo me sarebbe interessante proporre un contest sulle regexp... il confronto di idee insegna molto più del contenuto di 1000 libri conosciuto a menadito!

IMHO, per esempio, avrei ritenuto il "$" una direttiva ridondante, ma a pensarci bene lo è solo 99 volte su 100... e quindi va assolutamente aggiunto!

[/OT]

----------

## makoomba

@gioi

non va con font-bitstream-100dpi.

prendendo spunto da pkgname

```
#!/usr/bin/python

import sys

import portage 

for line in sys.stdin.readlines():print portage.pkgsplit(line)[0]
```

```
cat ebuild | ./test.py

font-bitstream-100dpi

vimap

ilbc-rfc3951

wine

```

----------

## gioi

 *makoomba wrote:*   

> @gioi
> 
> non va con font-bitstream-100dpi.
> 
> 

 

Umh... non ho gentoo sotto mano... ma quindi font-bitstream-100dpi è un pacchetto a sè stante e non una "versione" del più generico font-bitstream?

Scusate, ma per capire cosa eliminare devo capire cos'è una label identificativa di una determinata versione, e cosa invece fa parte del nome...

----------

## mouser

Purtroppo pkgname non mi va molto bene..... la comodità è quella di mandare 'emerge --pretend' in output, parsare per togliere le versioni ed infine ributtare il tutto in una variable....

Con pkgname devo per forza fare un ciclo for/while per ogni voce dell'emerge --pretend ed eseguire ogni volta una chiamata a pkgname.... il che vuol dire che se in output ho gnome (circa 48 software) devo, oltre al ciclo for/while, lanciare 48 volte pkgname.... con il sed/perl lancio una volta, parso e sono a posto... in termini di performance non ci dovrebbero essere paragoni (poi, non ho fatto debugging, vado solo a logica).

La soluzione di massima + db (o similare) delle eccezioni può essere una soluzione, ma per questa prima release (la 0.1) del mio programma pensavo di buttare fuori qualcosa di funzionante che potesse essere testato da molti.... per implementare una cosa del genere devo inventarmi anche un modo per gestire il db..... potrebbe essere un'ottima features semmai ci fossero delle release successive.

Per ora mi preme trovare qualcosa che sia il più generico possibile, e che quindi funzioni con la stra-grande maggioranza dei "pacchetti" presenti in portage.

L'unico problema è che sono una frana con le regexp  :Crying or Very sad: 

Ciriciao

mouser  :Wink: 

----------

## makoomba

 *gioi wrote:*   

> Umh... non ho gentoo sotto mano... ma quindi font-bitstream-100dpi è un pacchetto a sè stante e non una "versione" del più generico font-bitstream?
> 
> Scusate, ma per capire cosa eliminare devo capire cos'è una label identificativa di una determinata versione, e cosa invece fa parte del nome...

 

```
* media-fonts/font-bitstream-100dpi 

     Available versions:  ~1.0.0
```

il problema è che i nomi non seguono una regola ben definita.

appena pensi di aver trovato la regexp definitiva, 

ti salta fuori ProT-0-TypE con l'eccezione.

@mouser

lo script (in python) che ho postato lo usi in pipe, quindi viene eseguito solo una volta  :Wink: 

----------

## ProT-0-TypE

con pkgname + xargs non credo che dovresti avere problemi (sempre se ho capito bene qual  è il problema   :Laughing:  ).

Altrimenti l'ultima di makoomba sembra andare bene per tutto

----------

## gioi

Vediamo se ci siamo...

Torniamo alla sringa originale

```
 s/\-\d+\..+//
```

e questo funziona con tutto tranne che con i pacchetti "snapshot" cioè quelli che contengono una data come versione...

quelli si possono eliminare con un secondo filtro:

```
 s/\-\d{4,}.+//
```

Per cui il comando diventa:

```
comando_per_generare_la_lista | perl -p -e 's/\-\d+\..+//' | perl -p -e 's/\-\d{4,}.+//'
```

Se ci sono altre eccezioni segnalatemele, per favore! 'sta cosa mi sta prendendo...Last edited by gioi on Wed Jan 24, 2007 2:40 pm; edited 1 time in total

----------

## gioi

POST SBAGLIATO

----------

## ProT-0-TypE

 *gioi wrote:*   

> 
> 
> ```
> comando_per_generare_la_lista | perl -p -e 's/\-\d+\..+//' | perl -p -e 's/\-\d{4,}.+//'
> ```
> ...

 

con questo pacchetto non funziona: ilbc-rfc3951-0-r1

----------

## gioi

 *ProT-0-TypE wrote:*   

> 
> 
> con questo pacchetto non funziona: ilbc-rfc3951-0-r1

 

Ma esiste davvero? però questo non vale... non lo capisco io qual è la versione e quale il nome figuriamoci uno script...

----------

## ProT-0-TypE

esiste esiste...

il pacchetto è questo: dev-libs/ilbc-rfc3951

e la versione è la 0-r1

----------

## gioi

 *ProT-0-TypE wrote:*   

> esiste esiste...
> 
> il pacchetto è questo: dev-libs/ilbc-rfc3951
> 
> e la versione è la 0-r1

 

(ho capito, era una battuta la mia.... miiiiiiiiiii come sei pignoloooooooo!)   :Razz: 

----------

## mouser

 *gioi wrote:*   

> Ma esiste davvero? però questo non vale... non lo capisco io qual è la versione e quale il nome figuriamoci uno script...

 

LOL

mouser  :Wink: 

----------

## mouser

Momentaneamente ho adottato la soluzione di makoomba poichè, nonostante l'utilizzo di un piccolo script esterno, permette una semplice concatenazione in pipe utilizzando comunque direttive specifiche di portage e senza aggiungere dipendenze di sorta (a meno che.... mi sorge un dubbio.... python lo avete tutti??  :Laughing:  ).

Per ora resto così, nel frattempo continuo a testare di brutto.

Ciriciao

mouser  :Wink: 

----------

## makoomba

@mouser

puoi usare questo 

```
sed -re 's|-[0-9]+[^-]*(-r[0-9]+)?$||'
```

funziona con tutti gli ebuild in portage e ci mette un decimo del tempo rispetto alla versione in python

----------

## mouser

 *makoomba wrote:*   

> @mouser
> 
> puoi usare questo 
> 
> ```
> ...

 

PERFETTO!!!!   :Very Happy:   :Very Happy:   :Very Happy:   :Very Happy:   :Very Happy: 

Grandissimi!!!

Ora finalmente potrò fare debugging serio prima di rilasciare il mega-super script  :Very Happy: 

Ciriciao

mouser  :Wink: 

----------

## ProT-0-TypE

scommetto che è uno script per l'unmask dei pacchetti   :Very Happy: 

----------

## syntaxerrormmm

Io personalmente utilizzo eix (che praticamente abbiamo tutti) in questo modo:

```
set -- $(eix --format \<category\>/\<name\>  -e ${1}); echo $1
```

Ovviamente, mi sono fatto un piccolo scriptino. Funziona (per forza) con qualsiasi nome di pacchetto. Io lo uso spesso chiedendogli solo il nome esatto del pacchetto:

```
searchatom sed
```

Ciao.

----------

## mouser

[OT]

 *ProT-0-TypE wrote:*   

> scommetto che è uno script per l'unmask dei pacchetti  

 

Sei lontano, ma ti strabiliero (ora me la tiro, pensa alla figura quando lo rilascio  :Rolling Eyes: )

[/OT]

Ciriciao

mouser  :Wink: 

----------

## drizztbsd

There is only one way  :Razz: 

Q (chi conosce star trek sa di cosa sto parlando)

qlist -ICe "sys-apps/sed-4.1.5" (la C è opzionale, serve per non scrivere colorato)

----------

## lucapost

```
#> time eix --only-names -I |grep real

real    0m0.184s

user    0m0.151s

sys     0m0.030s
```

```
jarod:~ 

#> time qlist -Ie |grep real

real    0m0.016s

user    0m0.010s

sys     0m0.008s
```

ed io che pensavo che eix non lo batte nessuno   :Crying or Very sad: 

----------

## Kernel78

 *lucapost wrote:*   

> ed io che pensavo che eix non lo batte nessuno  

 

"battesse", non "batte" ...

Sono due programmi simili ma complementari; eix fornisce la descrizione, il sito web ecc ecc, mentre qlist punta a fornire i nomi dei file forniti da un pacchetto, paragonarli è come paragonare un affettato a un gelato, entrambi alimenti ma ben diversi tra di loro.

In ogni caso non è una gara, se scopri un sw che ti offre una funzionalità con dei bonus rispetto a quello che usi attualmente dovresti essere felice per la scoperta  :Wink: 

----------

