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:
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.