toni00c [url=http://forum.ubuntu-it.org/viewtopic.php?p=4551002#p4551002][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:ciao ho un grosso problema con le regular expression
dati i file nella dir :
Codice: Seleziona tutto
1.txt
a
a.*
appppppppppj.txt
arpiero.txt
a.txt
col.txt
cool.txt
coooooooool.txt
il ppppp ddsa l.txt
kola.txt
p2
pall.txt
.....
il comando ls | grep a.*
non mi restituisce nulla , mentre io gli sto dicendo a seguito da qualsiasi carattere ripetuto 0 o più volte
mentre
ls | grep "a.*" restituisce 9 risultati
Codice: Seleziona tutto
a
a.*
appppppppppj.txt
arpiero.txt
a.txt
il ppppp ddsa l.txt
kola.txt
pall.txt
e ls | egrep "a.{3}" restituisce 6 risultati
Codice: Seleziona tutto
appppppppppj.txt
arpiero.txt
a.txt
il ppppp ddsa l.txt
kola.txt
pall.txt
per quale motivo sono costretto a mettere il double quoting con le regular expression? quando è obbligatorio usarlo?
perchè io impongo a grep 3 occorrenze del carattere che precede e lui mi trova ad esempio arpiero.txt che di occorrenze di r n ha solo una ?
quando scrivo una regular expression i metacaratteri della shell perdono il loro significato no? es * nella shell significa qualsiasi stringa, mentre nella regular expression
qualsiasi occorrenza del carattere che precede
grazie
senza essere quotato, quel
non viene interpretato da grep come una espressione regolare, ma l'a.* viene espanso dalla shell prima di essere passato come argomento a grep.
quindi, la shell espande quel a.* nella lista di file corrispondenti (utile se lo passi direttamente ad ls: prova 'ls a.*'), pertanto grep riceve come argomento da cercare 'a.txt' e fallisce. in realta', non dovrebbe non restituire output: dovrebbe restituire tutte le righe che contengono 'a.txt', quindi 'a.txt' e 'koalA.TXT'. Sicuro di averlo dato nella directory giusta?
edit: visto ora che avevi altri file ('a.*') che sarebbero stati espansi dalla shell come argomenti a grep
il punto '.' e' un metacarattere, ha un suo significato nella regex. se vuoi 'trovarlo', devi fare un escape:
ls | grep 'a\.'
trova tutte le righe contenenti il pattern 'a.'
{3} significa ripetuto tre volte.
'a\.{3}'
significherebbe: 'a...'
curiosita': il punto e' un wildcard per un qualsiasi carattere, ripetuto una sola volta.
grep -E 'a\..{3}' troverebbe a seguito da punto seguito da tre caratteri ignoti, quindi koala.txt ed a.txt (quello che forse cercavi di fare prima)
non ho ben capito che vuoi fare, ma se lo scopo e' fare match del file 'a.*', allora come ti e' stato detto:
ls | grep 'a\.\*'
Alternativamente, puoi dire a grep di
interpretare l'argomento come una stringa fissa, non come una regex (cosa piu' sana, per esempio se stai sviluppando uno script):
dovrebbe farti ottenere il risultato voluto
We no longer think of chairs as technology; we just think of them as chairs. But there was a time when we hadn't worked out how many legs chairs should have, how tall they should be, and they would often 'crash' when we tried to use them.