Espressioni regolari con la bash/shell molto ... irregolari

Se avete problemi con l'installazione e la configurazione di Slackware postate qui. Non usate questo forum per argomenti generali... per quelli usate Gnu/Linux in genere.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Slackware, se l'argomento è generale usate il forum Gnu/Linux in genere.
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
freax
Linux 1.x
Linux 1.x
Messaggi: 177
Iscritto il: lun 19 gen 2009, 0:29
Slackware: 13
Desktop: kde4

Re: Espressioni regolari con la bash/shell molto ... irregolari

Messaggio da freax »

414N ha scritto:Per rimuovere i duplicati da un file (intendo righe uguali) si usa uniq, in combinazione con sort (le righe duplicate devono essere adiacenti):

Codice: Seleziona tutto

cat file | sort | uniq
devono rimanere nell'ordine nel quale erano quando li avevo prelevati , questa soluzione sarebbe praticamente la prima se solo potessi mischiare i link ...

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
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: Espressioni regolari con la bash/shell molto ... irregolari

Messaggio da targzeta »

Intendi dire che nella stessa pagina potresti avere dei link duplicati che vuoi eliminare? Però al tempo stesso vuoi mantenere l'ordine? Ad esempio:

Codice: Seleziona tutto

link1
link2
link1
Quale andrebbe eliminato? il primo o il secondo dei link1?

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

Avatar utente
freax
Linux 1.x
Linux 1.x
Messaggi: 177
Iscritto il: lun 19 gen 2009, 0:29
Slackware: 13
Desktop: kde4

Re: Espressioni regolari con la bash/shell molto ... irregolari

Messaggio da freax »

spina ha scritto:Intendi dire che nella stessa pagina potresti avere dei link duplicati che vuoi eliminare? Però al tempo stesso vuoi mantenere l'ordine? Ad esempio:

Codice: Seleziona tutto

link1
link2
link1
Quale andrebbe eliminato? il primo o il secondo dei link1?

Emanuele
è indifferente quale viene eliminato , le uniche due cose cose importanti sono :

1 - i link vanno lasciati con lo stesso ordine con il quale vengono presi e scritti nel file prodotto dalla regex
2 - ogni link deve comparire solo una volta in tutto l'elenco

ovviamente ad ogni riga corrisponde un link quindi si potrebbero anche comparare le righe a conoscere il comando giusto ...

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
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: Espressioni regolari con la bash/shell molto ... irregolari

Messaggio da targzeta »

freax ha scritto:...
1 - i link vanno lasciati con lo stesso ordine con il quale vengono presi e scritti nel file prodotto dalla regex
2 - ogni link deve comparire solo una volta in tutto l'elenco
...
E' per questo che ti ho fatto la domanda, se devo eliminare un duplicato, a seconda di quale elimino modifico anche l'ordine. Comunque se è indifferente...

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

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
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: Espressioni regolari con la bash/shell molto ... irregolari

Messaggio da targzeta »

Copia questo codice in un file, ad esempio in casa.awk:

Codice: Seleziona tutto

#!/bin/awk -f

function quote(a)
{
    gsub("/", "\\/", a);
    gsub("?", "\\?", a);
    return a;
}

BEGIN { i=0 }

{
    while ( match($0, /http:\/\/www\.megaupload\.\w+\/\?d=\w+/, a) )
    {
        gsub(quote(a[0]), "", $0);
        for ( found=j=0; j<i; j++ )
            if ( links[j] == a[0] )
            {
                found=1;
                break;
            }
        if ( found == 0 )
            links[i++]=a[0];
    }
}

END { for ( j=0; j<i; j++ ) print links[j] }
quindi rendi eseguibile il file con:

Codice: Seleziona tutto

chmod +x casa.awk
e usalo con:

Codice: Seleziona tutto

casa.awk file_html
o alternativamente con:

Codice: Seleziona tutto

wget -O - URL | casa.awk
Se non funziona dovresti postarci un file html di esempio, così possiamo aiutarti meglio,
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

Re: Espressioni regolari con la bash/shell molto ... irregolari

Messaggio da raffaele181188 »

Ma per duplicati cosa si intende??? Se salvi questo documento che stai leggendo ora e lo dai a quella regex ti trova sia roba tipo http://eccete.ra sia questo. Va chiarito lo scopo di questo programma: trovare le ancore (cioè il link all'interno di <a href="....">) o i plain link? O tutti e due? Perchè, nel caso, cambierebbe la RegEX. Anche se poi, alla fine, tutto fa brodo... Però questo può spiegare facilmente i "duplicati". Se io ho un link http://foo.bar con un markup (per intenderci)

Codice: Seleziona tutto

$URL="http://foo.bar"
<a href=$URL>$URL</a>
questo viene matchato effettivamente due volte, per cui puoi considerarlo un duplicato. Ma se in una pagina d'esempio i tuoi duplicati sono tutti consecutivi, allora forse vuol dire che devi cambiare la regex.

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: Espressioni regolari con la bash/shell molto ... irregolari

Messaggio da Mario Vanoni »

Mi diverte questa discussione ...

Ai tempi di AT&T UNIX SVR2, RE significava Regular Expression,
derivata dalle idee di ed(1), poi regex(3X), regcmp(3X) ecc.
Poi messa in [ef]grep(1), awk(1), sed(1) ecc.

Ora chiedo scusa allo STAFF!

man sort

Se un file contiene:

info1 <delimitatore> info2 <delimitatore> info3 ...

Con

sort -t <delimitatore> -k <posizione_della_info[123]> -u

risulta solo la prima posizione delle possibili molteplici info doppie.

Scusate il vecchio UNIXiano, ma giocando con

sort -t <deliminatore> -k 1 -k 3 -u
oppure
sort -t <deliminatore> -k 3 -k 1 -u

i risultati saranno diversi.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
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: Espressioni regolari con la bash/shell molto ... irregolari

Messaggio da targzeta »

Mario Vanoni ha scritto:...derivata dalle idee di ed(1), ... Poi messa in [ef]grep(1)...
Tra l'altro, grep è proprio l'acronimo di 'global regular expression print', sono i comando di ed(1) per stampare a video tutte le occorrenze di una espressione regolare (che è quello che fa grep).

Però devo dire che non ho capito molto il tuo intervento. Cioé, non ho capito se proponi una soluzione.

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

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: Espressioni regolari con la bash/shell molto ... irregolari

Messaggio da Mario Vanoni »

spina ha scritto:
Mario Vanoni ha scritto:...derivata dalle idee di ed(1), ... Poi messa in [ef]grep(1)...
Tra l'altro, grep è proprio l'acronimo di 'global regular expression print', sono i comando di ed(1) per stampare a video tutte le occorrenze di una espressione regolare (che è quello che fa grep).

Però devo dire che non ho capito molto il tuo intervento. Cioé, non ho capito se proponi una soluzione.

Emanuele
un file "sorttest", delimitazione un tabulatore, con

Codice: Seleziona tutto

info1   info2   info3
info1   info4   info3
info2   info2   info1
info2   info5   info1
info3   info2   info2
info3   info6   info2
info4   info2   info3
info4   info7   info3
info5   info2   info4
info5   info8   info4
info6   info2   info5
info6   info9   info5
sort -u -k 1 sorttest
sort -u -k 2 sorttest
sort -u -k 3 sorttest

forse rende l'idea.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
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: Espressioni regolari con la bash/shell molto ... irregolari

Messaggio da targzeta »

Si, ma io ancora non capisco se è una soluzione al problema. Perchè a me non sembra, quindi non sto capendo dove vuoi arrivare.

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

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: Espressioni regolari con la bash/shell molto ... irregolari

Messaggio da Mario Vanoni »

spina ha scritto:Si, ma io ancora non capisco se è una soluzione al problema. Perchè a me non sembra, quindi non sto capendo dove vuoi arrivare.

Emanuele
Visto che l'autore non scopre le carte,
citando raffaele181188
Offtopic: Per ricevere un aiuto buono e rapido, l'approccio migliore è senza dubbio spiegare tutto, per bene, e nel primo post

Infatti non capisco se il problema e` [ef]grep oppure il sort -u

Sorry che mi sono intromesso, e` meglio solo leggere.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
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: Espressioni regolari con la bash/shell molto ... irregolari

Messaggio da targzeta »

Mario Vanoni ha scritto:...
Infatti non capisco se il problema e` [ef]grep oppure il sort -u
...
Ahh, quindi anche tu come noi non stai capendo cosa chiede l'autore del thread. Scusa, ma io proprio non avevo capito :). Pensavo che la tua era una soluzione, ma non riuscivo a vederla (probabilmente perchè non so cosa cercare).

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

Avatar utente
freax
Linux 1.x
Linux 1.x
Messaggi: 177
Iscritto il: lun 19 gen 2009, 0:29
Slackware: 13
Desktop: kde4

Re: Espressioni regolari con la bash/shell molto ... irregolari

Messaggio da freax »

ragazzi non so come si risolva con la bash questo problema dei duplicati ma non tiriamo fuori addirittura matrici e strutture di dati che non c'entrano una cippa lippa , altrimenti al prossimo post si parla dei massimi sistemi :o :shock:

il problema è semplice e le condizioni , ripeto , sono queste :

- pagina web esterna , un file da parsare diciamo più in generale
- la forma scritta e il markup dei link non la posso conoscere a priori , quindi o link scritti in testo piano , o link che hanno il nome diverso dal valore di href="" deve essere uguale per lo script e/o comando
- questi link hanno un ovvia struttura generale , ovvero il link per megaupload saranno del tipo www.megaupload/?d=CXCXCXCX , i siti italiani saranno dei .it , etc etc ... e questa è l'unica cosa che si conosce a priori
- come potete voi stessi provare con grep e la regex di prima l'output è riga su riga , ogni riga contiene un link
- la regex di cui sopra mi tira fuori tutti i link a megaupload , siano essi in piano o dati come valore ad href
- va controllato il file di output con la lista dei link per verificare eventuali doppioni
- l'ordine va lasciato intatto

ripeto , la soluzione del sort -u è semplice e banale ed è ovvio che potendo cambiare l'ordine con il quale li prendo avrei adottato questa soluzione , quindi mettiamoci l'anima in pace perché questo sort non s'ha da fare .

domani provo lo script del buon spina e spero di risolvere .

lo script è da usare con praticamente tutti i link che corrispondano ad una tot regex , quindi tutti i link traducibili in un comando e "filtrabili" dagli altri , senza che vi mostro una pagina potete tranquillamente cambiare la regex per adattarla ad un altro genere di link , ad esempio :
listare tutti i link a video presenti in anteprima in questa pagina di youtube http://www.youtube.com/watch?v=jX2-i0X4E9U&NR=1 .

comunque sia si tratta di fare 2 cose
- filtrare la pagina tramite la X regex ( che con grep da un output riga su riga )
- controllare duplicati senza toccare nulla dell'ordine dato , se trova un duplicato lo cancella ( si può anche dire che cancelli la riga )
stop .

Avatar utente
raffaele181188
Packager
Packager
Messaggi: 789
Iscritto il: ven 7 set 2007, 21:40
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu
Località: DearSkin (FG)

Re: Espressioni regolari con la bash/shell molto ... irregolari

Messaggio da raffaele181188 »

Ti posto un esempio misto bash/python... Non so se ti serve, io l'ho fatto per esercizio visto che sto imparando il Python ;)
findlinx.sh

Codice: Seleziona tutto

#!/bin/sh
URL=$1
REGEX=$2
wget -O /dev/stdout "$URL" 2>&1 /dev/null | egrep -o "$REGEX" | python rmdupl.py

rmdupl.py

Codice: Seleziona tutto

import sys
urls = set()
for line in sys.stdin:
    urls.add(line[0:len(line) - 1])

for url in urls:
   print (url)

Ovviamente lo modifichi secondo quanto ti serve e lo invochi

Codice: Seleziona tutto

./findlinx.sh 'http://quellochetipa.re?tral-lallero=trallalla' 'la tua regex'
Esempio

Codice: Seleziona tutto

[bash-3.1]$ ./findlinx.sh \
> 'http://www.slacky.eu/forum/viewtopic.php?f=1&t=30446' \
> '\w+\.php'
posting.php
search.php
index.php
ucp.php
viewtopic.php
faq.php
www.php
file.php
rlist.php
memberlist.php
style.php
viewforum.php
Allegati
findlinx.tar.gz
(355 Byte) Scaricato 77 volte

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
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: Espressioni regolari con la bash/shell molto ... irregolari

Messaggio da targzeta »

freax ha scritto:...
domani provo lo script del buon spina e spero di risolvere .
...
Si, però occhio che ho modificato il post per tenere conto dei multi-link sulla stessa riga.

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

Rispondi