devono rimanere nell'ordine nel quale erano quando li avevo prelevati , questa soluzione sarebbe praticamente la prima se solo potessi mischiare i link ...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
Espressioni regolari con la bash/shell molto ... irregolari
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.
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.
Re: Espressioni regolari con la bash/shell molto ... irregolari
- targzeta
- 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
Intendi dire che nella stessa pagina potresti avere dei link duplicati che vuoi eliminare? Però al tempo stesso vuoi mantenere l'ordine? Ad esempio:Quale andrebbe eliminato? il primo o il secondo dei link1?
Emanuele
Codice: Seleziona tutto
link1
link2
link1Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
Re: Espressioni regolari con la bash/shell molto ... irregolari
è indifferente quale viene eliminato , le uniche due cose cose importanti sono :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:Quale andrebbe eliminato? il primo o il secondo dei link1?Codice: Seleziona tutto
link1 link2 link1
Emanuele
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 ...
- targzeta
- 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
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...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
...
Fammi pensare un attimo,
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- targzeta
- 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
Copia questo codice in un file, ad esempio in casa.awk:quindi rendi eseguibile il file con:e usalo con:o alternativamente con:
Se non funziona dovresti postarci un file html di esempio, così possiamo aiutarti meglio,
Emanuele
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] }Codice: Seleziona tutto
chmod +x casa.awkCodice: Seleziona tutto
casa.awk file_htmlCodice: Seleziona tutto
wget -O - URL | casa.awkEmanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- raffaele181188
- 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
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)
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.
Codice: Seleziona tutto
$URL="http://foo.bar"
<a href=$URL>$URL</a>
-
Mario Vanoni
- 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
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.
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.
- targzeta
- 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
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).Mario Vanoni ha scritto:...derivata dalle idee di ed(1), ... Poi messa in [ef]grep(1)...
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

- 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
un file "sorttest", delimitazione un tabulatore, conspina ha scritto: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).Mario Vanoni ha scritto:...derivata dalle idee di ed(1), ... Poi messa in [ef]grep(1)...
Però devo dire che non ho capito molto il tuo intervento. Cioé, non ho capito se proponi una soluzione.
Emanuele
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 2 sorttest
sort -u -k 3 sorttest
forse rende l'idea.
- targzeta
- 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
Si, ma io ancora non capisco se è una soluzione al problema. Perchè a me non sembra, quindi non sto capendo dove vuoi arrivare.
Emanuele
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
-
Mario Vanoni
- 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
Visto che l'autore non scopre le carte,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
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.
- targzeta
- 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
Ahh, quindi anche tu come noi non stai capendo cosa chiede l'autore del thread. Scusa, ma io proprio non avevo capitoMario Vanoni ha scritto:...
Infatti non capisco se il problema e` [ef]grep oppure il sort -u
...
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
Re: Espressioni regolari con la bash/shell molto ... irregolari
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
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 .
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 .
- raffaele181188
- 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
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
rmdupl.py
Ovviamente lo modifichi secondo quanto ti serve e lo invochi
Esempio
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
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)
Codice: Seleziona tutto
./findlinx.sh 'http://quellochetipa.re?tral-lallero=trallalla' 'la tua regex'
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
- targzeta
- 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
Si, però occhio che ho modificato il post per tenere conto dei multi-link sulla stessa riga.freax ha scritto:...
domani provo lo script del buon spina e spero di risolvere .
...
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
