Repository 32bit  Forum
Repository 64bit  Wiki

Match Espressioni Regolari

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.

Match Espressioni Regolari

Messaggioda RedSkull92 » sab dic 04, 2010 14:40

Ho bisogno di una mano.
Sto realizzando un piccolo script in bash e mi serve prendere delle informazioni da un file.

ho un file così composto:
#Blah blah blah

[OWN]
http://sito_mio.it
[/OWN]

[LISTA]
http://sito1.com
http:/sito2.it
http://sito3.org
...
...
...
...
[/LISTA]


Come faccio ad estrapolare i campi contenuti nei tag [OWN][/OWN] e [LISTA][/LISTA] ? (Solo quelli quindi escludendo anche i tag stessi)
Grazie per l'eventuale risposta.
Avatar utente
RedSkull92
Linux 2.6
Linux 2.6
 
Messaggi: 554
Iscritto il: mar apr 21, 2009 16:25
Località: Palermo
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox

Re: Match Espressioni Regolari

Messaggioda targzeta » sab dic 04, 2010 16:08

Ma se i campi sono tutti del tipo 'http://' non basta un semplice grep?

Emanuele
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: 6185
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: Match Espressioni Regolari

Messaggioda RedSkull92 » dom dic 05, 2010 1:33

Sì ma io devo poter distinguere i link presenti tra i tago OWN o LISTA, come faccio a capire quale link è contenuto in 1 e quale è contenuto nell'altro ?
Avatar utente
RedSkull92
Linux 2.6
Linux 2.6
 
Messaggi: 554
Iscritto il: mar apr 21, 2009 16:25
Località: Palermo
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox

Re: Match Espressioni Regolari

Messaggioda ZeD » dom dic 05, 2010 9:02

Mica banale :)
comunque prova a guardare l'opzione multiriga di sed

oppure prova con awk:

Codice: Seleziona tutto
awk ' /[OWN]/ { DOIT=1 }; DOIT { RIGHE+=$0 } /[/OWN]/ { print RIGHE }' nome_del_file
Avatar utente
ZeD
Linux 2.0
Linux 2.0
 
Messaggi: 112
Iscritto il: ven ott 28, 2005 11:30
Località: Terra
Slackware: 12.1

Re: Match Espressioni Regolari

Messaggioda shark1500 » dom dic 05, 2010 10:22

Dev'essere per forza in bash? Perche` io per fare prima punterei al perl, che per queste cose bastano poche righe
Avatar utente
shark1500
Linux 2.6
Linux 2.6
 
Messaggi: 785
Iscritto il: gio apr 03, 2008 13:33
Località: Modna
Slackware: current
Kernel: 2.6.27.7-smp
Desktop: kde

Re: Match Espressioni Regolari

Messaggioda 414N » dom dic 05, 2010 10:29

Per me fai prima a farti un parsing a manina.
Giusto per provare, ho buttato giù il seguente scriptino:
Codice: Seleziona tutto
#!/bin/sh

OWN_START="[OWN]"
OWN_END="[/OWN]"
LISTA_START="[LISTA]"
LISTA_END="[/LISTA]"


# $1 : TAG start
# $2 : TAG end
# $3 : result variable (list)
# $4 : input file
function read_between_tags ()
{
        while read ROW
        do
                if [ "$ROW" = "$1" ]
                then
                        I=0
                        while read LIST_ROW
                        do
                                if [ "$LIST_ROW" != "$2" ]
                                then
                                        eval "$3[$I]="$LIST_ROW""
                                        I=$((I+1))
                                else
                                        return 0
                                fi
                        done
                fi
        done < "$4"
}

read_between_tags $OWN_START $OWN_END OWN file.txt
echo -e "OWN contents:\n\t ${OWN[*]}"
read_between_tags $LIST_START $LIST_END LIST file.txt
echo -e "LISTA contents:\n\t ${LIST[*]}"

È praticamente tutto nella funzione read_between_tags: dandole in pasto il tag iniziale, quello finale, una variabile nella quale salvare il contenuto (come array) e un file, legge il file finché non incontra il tag iniziale, dopodiché riempie l'array con quel che trova prima del tag finale.
Ovviamente è migliorabile (non ho pensato a utenti "bizantini" :) ) però fa quel che deve col file presentato come esempio.
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2882
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: Match Espressioni Regolari

Messaggioda targzeta » dom dic 05, 2010 10:40

RedSkull92 ha scritto:Sì ma io devo poter distinguere i link presenti tra i tago OWN o LISTA, come faccio a capire quale link è contenuto in 1 e quale è contenuto nell'altro ?
Si ma tu questo prima non l'avevi detto :).

Bisogna capire cosa intendi per "distinguere". Questo scriptino sed:
Codice: Seleziona tutto
sed -n '/OWN/{p;b own};/LISTA/{p;b lista};d;:own n;/\OWN/d;p;b own;:lista n;/\LISTA/d;p; b lista' input_file
con il file che hai postato all'inizio restituisce:
Codice: Seleziona tutto
[OWN]
http://sito_mio.it
[LISTA]
http://sito1.com
http:/sito2.it
http://sito3.org
...
...
...
...
io da quest'output li distinguo benissimo. Però, alternativamente puoi scrivere tutti i siti sotto 'OWN' nel file 'own' e tutti quelli di 'LISTA' nel file 'lista', in questo modo:
Codice: Seleziona tutto
sed -n '/OWN/b own;/LISTA/b lista;d;:own n;/\OWN/d;w own
b own;:lista n;/\LISTA/d;w lista
b lista' input_file


Emanuele
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: 6185
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: Match Espressioni Regolari

Messaggioda albatrosla » dom dic 05, 2010 12:28

La mia personale soluzione:
Codice: Seleziona tutto
for tag in OWN LIST
do
sed -n -e $(grep -n $tag <file>|cut -d':' -f1|sed 'N;s/\n/,/')p <file>|sed -e 1d -e $\d > $tag.tag
done

E' pratica perché è sufficiente cambiare la lista in testa al ciclo per estrarre il contenuto di qualsiasi serie di tag. Inoltre la redirezione dell'output in un file <tag>.tag si può facilmente cambiare in un assegnamento a variabile o qualsivoglia target. Non ci ho perso molto tempo: si può rendere più robusto affinando l'argomento di grep per evitare falsi risultati.
albatrosla
Packager
Packager
 
Messaggi: 1294
Iscritto il: sab mar 27, 2004 0:00
Località: Bressa - Friuli / Torino
Slackware: current
Desktop: fluxbox.git

Re: Match Espressioni Regolari

Messaggioda RedSkull92 » dom dic 05, 2010 15:08

Il codice postato da Alabtrosta è perfetto.
Io ho provato ad usare le regex ma non ho trovato il modo per farmi prendere i valori che volevo.
Grazie per l'immenso aiuto ragazzi.
Avatar utente
RedSkull92
Linux 2.6
Linux 2.6
 
Messaggi: 554
Iscritto il: mar apr 21, 2009 16:25
Località: Palermo
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Google [Bot] e 1 ospite

cron