Repository 32bit  Forum
Repository 64bit  Wiki

Match Espressioni Regolari

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
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 dell'ultima regola 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 15: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: 535
Iscritto il: mar apr 21, 2009 17:25
Località: Palermo
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox

Re: Match Espressioni Regolari

Messaggioda targzeta » sab dic 04, 2010 17:08

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
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 5907
Iscritto il: gio nov 03, 2005 15: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 2: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: 535
Iscritto il: mar apr 21, 2009 17:25
Località: Palermo
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox

Re: Match Espressioni Regolari

Messaggioda ZeD » dom dic 05, 2010 10: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 12:30
Località: Terra
Slackware: 12.1

Re: Match Espressioni Regolari

Messaggioda shark1500 » dom dic 05, 2010 11: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 14:33
Località: Modna
Slackware: current
Kernel: 2.6.27.7-smp
Desktop: kde

Re: Match Espressioni Regolari

Messaggioda 414N » dom dic 05, 2010 11: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: 2844
Iscritto il: mer feb 13, 2008 17:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: Match Espressioni Regolari

Messaggioda targzeta » dom dic 05, 2010 11: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
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: 5907
Iscritto il: gio nov 03, 2005 15: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 13: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: 1291
Iscritto il: sab mar 27, 2004 1:00
Località: Bressa - Friuli / Torino
Slackware: current
Desktop: fluxbox.git

Re: Match Espressioni Regolari

Messaggioda RedSkull92 » dom dic 05, 2010 16: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: 535
Iscritto il: mar apr 21, 2009 17:25
Località: Palermo
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti