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.
Rispondi
Avatar utente
RedSkull92
Linux 3.x
Linux 3.x
Messaggi: 567
Iscritto il: mar 21 apr 2009, 17:25
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox
Località: Palermo
Contatta:

Match Espressioni Regolari

Messaggio da RedSkull92 »

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
targzeta
Iper Master
Iper Master
Messaggi: 6631
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: Match Espressioni Regolari

Messaggio da targzeta »

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

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

Avatar utente
RedSkull92
Linux 3.x
Linux 3.x
Messaggi: 567
Iscritto il: mar 21 apr 2009, 17:25
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox
Località: Palermo
Contatta:

Re: Match Espressioni Regolari

Messaggio da RedSkull92 »

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
ZeD
Linux 1.x
Linux 1.x
Messaggi: 112
Iscritto il: ven 28 ott 2005, 12:30
Slackware: 12.1
Località: Terra

Re: Match Espressioni Regolari

Messaggio da ZeD »

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
shark1500
Linux 3.x
Linux 3.x
Messaggi: 785
Iscritto il: gio 3 apr 2008, 14:33
Slackware: current
Kernel: 2.6.27.7-smp
Desktop: kde
Località: Modna

Re: Match Espressioni Regolari

Messaggio da shark1500 »

Dev'essere per forza in bash? Perche` io per fare prima punterei al perl, che per queste cose bastano poche righe

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: Match Espressioni Regolari

Messaggio da 414N »

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
targzeta
Iper Master
Iper Master
Messaggi: 6631
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: Match Espressioni Regolari

Messaggio da targzeta »

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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

albatrosla
Packager
Packager
Messaggi: 1339
Iscritto il: sab 27 mar 2004, 0:00
Slackware: current
Desktop: fluxbox.git
Località: Collegno, but made in Friûl
Contatta:

Re: Match Espressioni Regolari

Messaggio da albatrosla »

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.

Avatar utente
RedSkull92
Linux 3.x
Linux 3.x
Messaggi: 567
Iscritto il: mar 21 apr 2009, 17:25
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox
Località: Palermo
Contatta:

Re: Match Espressioni Regolari

Messaggio da RedSkull92 »

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.

Rispondi