Pagina 1 di 1

Match Espressioni Regolari

Inviato: sab 4 dic 2010, 14:40
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.

Re: Match Espressioni Regolari

Inviato: sab 4 dic 2010, 16:08
da targzeta
Ma se i campi sono tutti del tipo 'http://' non basta un semplice grep?

Emanuele

Re: Match Espressioni Regolari

Inviato: dom 5 dic 2010, 1:33
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 ?

Re: Match Espressioni Regolari

Inviato: dom 5 dic 2010, 9:02
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

Re: Match Espressioni Regolari

Inviato: dom 5 dic 2010, 10:22
da shark1500
Dev'essere per forza in bash? Perche` io per fare prima punterei al perl, che per queste cose bastano poche righe

Re: Match Espressioni Regolari

Inviato: dom 5 dic 2010, 10:29
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.

Re: Match Espressioni Regolari

Inviato: dom 5 dic 2010, 10:40
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

Re: Match Espressioni Regolari

Inviato: dom 5 dic 2010, 12:28
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.

Re: Match Espressioni Regolari

Inviato: dom 5 dic 2010, 15:08
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.