Repository 32bit  Forum
Repository 64bit  Wiki

regexp e pacchetti slackware - aiutatemi vi prego!!! :)

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.

regexp e pacchetti slackware - aiutatemi vi prego!!! :)

Messaggioda danix » sab mag 24, 2008 14:43

Ciao a tutti,
da circa 3 ore sto giocando con un'espressione regolare per riuscire ad estrarre il nome del programma dal nome completo del pacchetto...
mi spiego meglio, ho uno script che legge il file FILELIST.txt (ad esempio quello che trovate nel repository di slacky) e in base ad una stringa passatagli come argomento effettua una ricerca, il tutto è abbastanza semplice, solo che mi restituisce il pacchetto con tutto il percorso in questo modo:
Codice: Seleziona tutto
$ ./findpkg mozilla
./multimedia/gnash/0.8.2/gnash-mozilla-plugin-0.8.2-i686-1as.tgz
./multimedia/vlc/0.8.6f/vlc-mozilla-plugin-0.8.6f-i686-1as.tgz
./network/firefox/2.0.0.14/en-us/mozilla-firefox-en-us-2.0.0.14-i686-1sl.tgz
./network/firefox/2.0.0.14/it/mozilla-firefox-it-2.0.0.14-i686-1sl.tgz
./network/thunderbird/2.0.0.14/en-us/mozilla-thunderbird-en-us-2.0.0.14-i686-1sl.tgz
./network/thunderbird/2.0.0.14/it/mozilla-thunderbird-it-2.0.0.14-i686-1sl.tgz

mentre io vorrei che mi restituisse una cosa del genere:
Codice: Seleziona tutto
$ ./findpkg mozilla
gnash-mozilla-plugin
vlc-mozilla-plugin
mozilla-firefox-en-us
mozilla-firefox-it
mozilla-thunderbird-en-us
mozilla-thunderbird-it

ragionando logicamente ho pensato di partire dalla fine del nome in quanto ho dei campi che sono fissi, ho l'estensione, il build, l'architettura e la versione che devo eliminare, poi devo semplicemente saltare tutto quello che c'è fino ad arrivare alla prima "/" che incontro, e da li posso cancellare tutto... Correggetemi se sbaglio...
Solo che non so come comportarmi perchè ci sono pacchetti che hanno il nome composto da una sola parola, ma ci sono pacchetti (come questi dell'esempio) che hanno il nome con varie parole separate da "-"...
con alcuni pacchetti ero giunto a questa RE:
Codice: Seleziona tutto
sed 's/-.*.tgz//g'

che ad esempio da "./utilities/kslackysearch/1.1/kslackysearch-1.1-noarch-2dx.tgz" mi restituiva "./utilities/kslackysearch/1.1/kslackysearch".
Per gli esempi sopra però non funziona, perchè del pacchetto "./network/firefox/2.0.0.14/en-us/mozilla-firefox-en-us-2.0.0.14-i686-1sl.tgz" mi restituirebbe solo "./network/firefox/2.0.0.14/en" (relativo alla directory, non al nome del pacchetto...)

Un'altra cosa, usando sed in una pipe, fino a quando uso una sola RE posso fare
Codice: Seleziona tutto
bla bla bla | sed 'miaRegExp'

ma quando ne devo mettere 2 in fila devo usare 2 istanze di sed in questo modo:
Codice: Seleziona tutto
bla bla bla |sed 'miaRegExp' |sed 'altraRegExp'

???

Spero saprete aiutarmi, grazie mille a tutti...


Ciau
Avatar utente
danix
Staff
Staff
 
Messaggi: 3280
Iscritto il: ven ott 27, 2006 18:32
Località: Siderno (RC)
Nome Cognome: Danilo M.
Slackware: 64 14.0
Kernel: 3.2.29
Desktop: fluxbox

Re: regexp e pacchetti slackware - aiutatemi vi prego!!! :)

Messaggioda algol » sab mag 24, 2008 15:16

Non sono assolutamente esperto, ma per eliminare almeno il path precedente al nome del pacchetto potresti provare basename; funziona su un path reale, non so se leggendo da file, ma se così fosse credo che il resto poi andrebbe da se...
Avatar utente
algol
Linux 2.6
Linux 2.6
 
Messaggi: 969
Iscritto il: gio set 07, 2006 0:19
Slackware: 12.1
Kernel: 2.6.26.1
Desktop: xfce4.4.2

Re: regexp e pacchetti slackware - aiutatemi vi prego!!! :)

Messaggioda cymon » sab mag 24, 2008 15:18

Prova a "contare" i trattini che vuoi eliminare...

Codice: Seleziona tutto
 sed 's/-[^-]\+-[^-]\+-[^-]\+.tgz$//g'


In un nome di pacchetto i trattini iniziali sono quanti vuoi, ma quelli finali che dividono versione-architettura-pacchettizzazione sono standard e non contengono sicuramente trattini ([^-]\+ prende una tag).
Avatar utente
cymon
Linux 2.4
Linux 2.4
 
Messaggi: 430
Iscritto il: ven gen 05, 2007 1:40
Località: Milano
Slackware: 13.1
Kernel: 2.6.33.4-smp
Desktop: Fluxbox

Re: regexp e pacchetti slackware - aiutatemi vi prego!!! :)

Messaggioda sixjan » sab mag 24, 2008 15:39

Questo scriptozzo fa quello che vuoi. L'ho fatto al volo e testato poco, ma
pare che funzioni. Forse non è il massimo dell'eleganza :-) ciao

Edit: ho visto che ti interessava di più usare sed, consideralo allora solo come un esempio.
E' il bello di GNU/linux in fondo, ci sono tanti modi e strumenti per fare la stessa cosa. :-)

Codice: Seleziona tutto
#!/bin/bash

TMPFILE=`mktemp`

cat FILELIST.TXT | grep -i $1 | grep "\.tgz" | grep -v "\.asc" | awk '{print $8}' > $TMPFILE

for N in $(seq `wc -l $TMPFILE | cut -f1 -d" "`); do
 
   basename 2>/dev/null `head -$N $TMPFILE | tail -1` | rev | cut -f4-100 -d"-" | rev

done

rm -f $TMPFILE

sixjan
Linux 2.4
Linux 2.4
 
Messaggi: 407
Iscritto il: dom gen 06, 2008 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: regexp e pacchetti slackware - aiutatemi vi prego!!! :)

Messaggioda sixjan » sab mag 24, 2008 15:55

Il primo cat era inutile:

Codice: Seleziona tutto

TMPFILE=`mktemp`

grep -i $1 FILELIST.TXT | grep "\.tgz" | grep -v "\.asc" | awk '{print $8}' > $TMPFILE

for N in $(seq `wc -l $TMPFILE | cut -f1 -d" "`); do
 
   basename 2>/dev/null `head -$N $TMPFILE | tail -1` | rev | cut -f4-100 -d"-" | rev

done

rm -f $TMPFILE

sixjan
Linux 2.4
Linux 2.4
 
Messaggi: 407
Iscritto il: dom gen 06, 2008 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: regexp e pacchetti slackware - aiutatemi vi prego!!! :)

Messaggioda algol » sab mag 24, 2008 15:59

Raga ma quanto vi invidio per l'immediata capacità che molti di voi hanno nel creare software per ogni problema (anche riferito a [url]viewtopic.php?p=201589#p201589[/url]) :( :( :(

P.s. eh almeno basename c'azzeccava qualcosa... :happy8:
Avatar utente
algol
Linux 2.6
Linux 2.6
 
Messaggi: 969
Iscritto il: gio set 07, 2006 0:19
Slackware: 12.1
Kernel: 2.6.26.1
Desktop: xfce4.4.2

Re: regexp e pacchetti slackware - aiutatemi vi prego!!! :)

Messaggioda danix » sab mag 24, 2008 16:03

algol ha scritto:Non sono assolutamente esperto, ma per eliminare almeno il path precedente al nome del pacchetto potresti provare basename; funziona su un path reale, non so se leggendo da file, ma se così fosse credo che il resto poi andrebbe da se...

a volte le cose più semplici sono quelle più efficaci (e nel mio caso quelle a cui penso di meno... :roll: ) grazie :D

cymon ha scritto:Prova a "contare" i trattini che vuoi eliminare...

Codice: Seleziona tutto
 sed 's/-[^-]\+-[^-]\+-[^-]\+.tgz$//g'


In un nome di pacchetto i trattini iniziali sono quanti vuoi, ma quelli finali che dividono versione-architettura-pacchettizzazione sono standard e non contengono sicuramente trattini ([^-]\+ prende una tag).


Ho risolto usando queste 2 soluzioni accoppiate ;)
Codice: Seleziona tutto
basename $pkg | sed 's/-[^-]\+-[^-]\+-[^-]\+.tgz$//g'

la variabile $pkg contiene una stringa di quelle che ho postato nell'esempio :D


@sixjan:
Grazie dello script, in effetti per risalire alla lista dei pacchetti uso:
Codice: Seleziona tutto
grep -i "$program" $filelist |grep "tgz" |grep -v "asc" |cut -d" " -f8

dove $program è il programma da cercare e $filelist è il file FILELIST.txt di Slacky (una copia locale ovviamente)... il cut finale fa la stessa cosa del tuo awk, qual'è migliore secondo te?? Mi conviene usare awk??

Grazie mille a tutti per l'aiuto :D


Ciau
Avatar utente
danix
Staff
Staff
 
Messaggi: 3280
Iscritto il: ven ott 27, 2006 18:32
Località: Siderno (RC)
Nome Cognome: Danilo M.
Slackware: 64 14.0
Kernel: 3.2.29
Desktop: fluxbox

Re: regexp e pacchetti slackware - aiutatemi vi prego!!! :)

Messaggioda sixjan » sab mag 24, 2008 16:08

Tra l'ultimo cut e awk non credo ci sia differenza di prestazioni :-)
Trattasi di 'de gustibus...' ciao.
sixjan
Linux 2.4
Linux 2.4
 
Messaggi: 407
Iscritto il: dom gen 06, 2008 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: regexp e pacchetti slackware - aiutatemi vi prego!!! :)

Messaggioda cymon » sab mag 24, 2008 16:12

Visto che siamo già al tuning della morte :lol:
Codice: Seleziona tutto
grep -i "$program" $filelist |grep "tgz$"  |cut -d" " -f8

permette di evitare il grep per eliminare gli asc.
Avatar utente
cymon
Linux 2.4
Linux 2.4
 
Messaggi: 430
Iscritto il: ven gen 05, 2007 1:40
Località: Milano
Slackware: 13.1
Kernel: 2.6.33.4-smp
Desktop: Fluxbox

Re: regexp e pacchetti slackware - aiutatemi vi prego!!! :)

Messaggioda targzeta » sab mag 24, 2008 16:22

Sulla scia della regex di cymon puoi usare questa invocando solo sed senza basename:
Codice: Seleziona tutto
echo "./network/thunderbird/2.0.0.14/en-us/mozilla-thunderbird-en-us-2.0.0.14-i686-1sl.tgz" | sed 's;.*/\(.*\)\(-[^-]\+\)\{3\};\1;'


Ma la differenza è minima, anche perchè invochi sempre due comandi....anche se echo è più veloce di basename....ma sono sciocchezze.

Spina

P.S. Non ho capito bene cosa fanno quei tre grep infilerati, ma così a occhio mi sembrano bruttini, dammi dieci minuti e vedo se posso suggerirti qualcosa di meglio per quello che vuoi fare.

Pippi.S. Tra il cut e l'awk io userei senz'altro 'cut' visto che fa quello di mestiere, mentre awk fa moooolto altro, anzi, se usi awk puoi risparmiarti anche tutti i sed e i grep del mondo, fai solo uno scriptino per lui.
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6176
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: regexp e pacchetti slackware - aiutatemi vi prego!!! :)

Messaggioda sixjan » sab mag 24, 2008 16:25

cymon ha scritto:Visto che siamo già al tuning della morte :lol:
Codice: Seleziona tutto
grep -i "$program" $filelist |grep "tgz$"  |cut -d" " -f8

permette di evitare il grep per eliminare gli asc.


Hai ragione. Inoltre il solo "asc" di danix85 cancella per esempio il pacchetto "hasciicam".
Per questo avevo messo "\.asc", ma grep "tgz$" è l'ideale.
sixjan
Linux 2.4
Linux 2.4
 
Messaggi: 407
Iscritto il: dom gen 06, 2008 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: regexp e pacchetti slackware - aiutatemi vi prego!!! :)

Messaggioda targzeta » sab mag 24, 2008 16:30

cymon ha scritto:Visto che siamo già al tuning della morte :lol:
Codice: Seleziona tutto
grep -i "$program" $filelist |grep "tgz$"  |cut -d" " -f8

permette di evitare il grep per eliminare gli asc.

Ma è normale che a me il comando:
Codice: Seleziona tutto
grep -i "mozilla" FILELIST.TXT |grep "tgz$"  |cut -d" " -f8

restituisca:
2008-04-21
2008-05-09


cos'è che dovrebbe restituire? Preciso che io ho una Slamd64.

Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6176
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: regexp e pacchetti slackware - aiutatemi vi prego!!! :)

Messaggioda danix » sab mag 24, 2008 16:49

spina ha scritto:Ma è normale che a me il comando:
Codice: Seleziona tutto
grep -i "mozilla" FILELIST.TXT |grep "tgz$"  |cut -d" " -f8

restituisca:
2008-04-21
2008-05-09


cos'è che dovrebbe restituire? Preciso che io ho una Slamd64.

Spina

dovrebbe restituirti
Codice: Seleziona tutto
$ grep -i "mozilla" FILELIST.TXT |grep "tgz$"  |cut -d" " -f8
./multimedia/gnash/0.8.2/gnash-mozilla-plugin-0.8.2-i686-1as.tgz
./multimedia/vlc/0.8.6f/vlc-mozilla-plugin-0.8.6f-i686-1as.tgz
./network/firefox/2.0.0.14/en-us/mozilla-firefox-en-us-2.0.0.14-i686-1sl.tgz
./network/firefox/2.0.0.14/it/mozilla-firefox-it-2.0.0.14-i686-1sl.tgz
./network/thunderbird/2.0.0.14/en-us/mozilla-thunderbird-en-us-2.0.0.14-i686-1sl.tgz
./network/thunderbird/2.0.0.14/it/mozilla-thunderbird-it-2.0.0.14-i686-1sl.tgz

il mio FILELIST.txt è quello di Slacky per la 12.1...
Avatar utente
danix
Staff
Staff
 
Messaggi: 3280
Iscritto il: ven ott 27, 2006 18:32
Località: Siderno (RC)
Nome Cognome: Danilo M.
Slackware: 64 14.0
Kernel: 3.2.29
Desktop: fluxbox

Re: regexp e pacchetti slackware - aiutatemi vi prego!!! :)

Messaggioda targzeta » sab mag 24, 2008 16:56

Senti, ma se non ho capito male, tutto il tuo script si può riassumere con:
Codice: Seleziona tutto
sed  -n /$program/I'{s;.*/\(.*\)\(-[^-]\+\)\{3\}\.tgz$;\1;p}' $filelist
?

Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6176
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: regexp e pacchetti slackware - aiutatemi vi prego!!! :)

Messaggioda sixjan » sab mag 24, 2008 17:14

cymon ha scritto:Visto che siamo già al tuning della morte :lol:
Codice: Seleziona tutto
grep -i "$program" $filelist |grep "tgz$"  |cut -d" " -f8

permette di evitare il grep per eliminare gli asc.


Per continuare col tuning della morte :-), togliamo un altro grep:
Codice: Seleziona tutto
grep -i $1.*"tgz$" FILELIST.TXT | cut -d" " -f8
sixjan
Linux 2.4
Linux 2.4
 
Messaggi: 407
Iscritto il: dom gen 06, 2008 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Bing [Bot] e 1 ospite

cron