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.
Avatar utente
danix
Staff
Staff
Messaggi: 3286
Iscritto il: ven ott 27, 2006 19:32
Nome Cognome: Danilo M.
Slackware: 64 14.1
Kernel: 4.4.0
Desktop: kde4
Località: Siderno (RC)
Contatta:

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

Messaggioda danix » sab mag 24, 2008 15: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
danix

myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
algol
Linux 2.6
Linux 2.6
Messaggi: 969
Iscritto il: gio set 07, 2006 1:19
Slackware: 12.1
Kernel: 2.6.26.1
Desktop: xfce4.4.2
Contatta:

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

Messaggioda algol » sab mag 24, 2008 16: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
cymon
Linux 2.4
Linux 2.4
Messaggi: 430
Iscritto il: ven gen 05, 2007 1:40
Slackware: 13.1
Kernel: 2.6.33.4-smp
Desktop: Fluxbox
Località: Milano
Contatta:

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

Messaggioda cymon » sab mag 24, 2008 16: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).

sixjan
Linux 2.4
Linux 2.4
Messaggi: 413
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 16: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: 413
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 16: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


Avatar utente
algol
Linux 2.6
Linux 2.6
Messaggi: 969
Iscritto il: gio set 07, 2006 1:19
Slackware: 12.1
Kernel: 2.6.26.1
Desktop: xfce4.4.2
Contatta:

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

Messaggioda algol » sab mag 24, 2008 16: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
danix
Staff
Staff
Messaggi: 3286
Iscritto il: ven ott 27, 2006 19:32
Nome Cognome: Danilo M.
Slackware: 64 14.1
Kernel: 4.4.0
Desktop: kde4
Località: Siderno (RC)
Contatta:

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

Messaggioda danix » sab mag 24, 2008 17: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
danix

myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

sixjan
Linux 2.4
Linux 2.4
Messaggi: 413
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 17:08

Tra l'ultimo cut e awk non credo ci sia differenza di prestazioni :-)
Trattasi di 'de gustibus...' ciao.

Avatar utente
cymon
Linux 2.4
Linux 2.4
Messaggi: 430
Iscritto il: ven gen 05, 2007 1:40
Slackware: 13.1
Kernel: 2.6.33.4-smp
Desktop: Fluxbox
Località: Milano
Contatta:

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

Messaggioda cymon » sab mag 24, 2008 17: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
targzeta
Iper Master
Iper Master
Messaggi: 6352
Iscritto il: gio nov 03, 2005 14:05
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

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

Messaggioda targzeta » sab mag 24, 2008 17: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à 

sixjan
Linux 2.4
Linux 2.4
Messaggi: 413
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 17: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.

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

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

Messaggioda targzeta » sab mag 24, 2008 17: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
danix
Staff
Staff
Messaggi: 3286
Iscritto il: ven ott 27, 2006 19:32
Nome Cognome: Danilo M.
Slackware: 64 14.1
Kernel: 4.4.0
Desktop: kde4
Località: Siderno (RC)
Contatta:

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

Messaggioda danix » sab mag 24, 2008 17: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...
danix

myself ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

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

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

Messaggioda targzeta » sab mag 24, 2008 17: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à 

sixjan
Linux 2.4
Linux 2.4
Messaggi: 413
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 18: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


Torna a “Programmazione”

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite