Newsgroup: it.comp.os.linux.development
Titolo: Regular expression per togliere commenti

Sto cercando di scrivere una regular expression che mi restituisca (con 
egrep) le righe di un file che non sono commenti (intesi come una riga che 
abbia 0 o più spazi seguiti da #). 
Se voglio *solo* i commenti funziona ^[ ]*[#] quindi pensavo che per avere 
tutto tranne i commenti bastasse ^[ ]*[^#] cioè, a leggerla così, una riga 
che inizi con 0 o più spazi seguiti *non* da #, ma questa toglie solo le 
righe che iniziano con # mentre quelle che hanno degli spazi davanti 
seguiti da # no.
Cosa sbaglio? Non c'è un modo quando ho un'espressione di negarla per intero 
(prendo quella che becca i commenti che funziona e chiedo *non quella*)?
-- 
       ^    ^
oOo (Il Gatto) oOo

 tutto tranne i commenti bastasse ^[ ]*[^#] cioč, a leggerla cosě, una riga 
-v
-- 
HappyCactus - Linux User #209744 - LFS User #6046 - >>> SMSPM1050 <<<
              YAGF Member Group >>> 
www.google.com
 <<<
Ci sono 10 categorie di persone al mondo: quelle che capiscono
il sistema binario e quelle che non lo capiscono.

 -v
Grazie! 
Per curiosità... c'era modo di ottenere il risultato anche direttamente con 
l'espressione? Ho riletto tutte le guide alle reg. exp. che ho trovato in 
rete e continuo a non capire perchè quella che avevo scritto io non va...


 abbia 0 o piů spazi seguiti da #). 
\s*#
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! Computer programmers never die, they just get lost in the processing. !>-

 (prendo quella che becca i commenti che funziona e chiedo *non quella*)?
Se non vuoi usare l'opzione -v, usa questa espressione: ^[^#]+$
Il trucco e` in $ (terminatore di riga): se lo ometti, l'espressione
trova tutte le righe che, a partire da inizio riga, abbiano un numero
qualsiasi di caratteri diverso da `#'.  Altrimenti questa passerebbe:
    # foo
...perche' ci sono quattro spazi prima di `#', quindi un certo numero di
caratteri diversi da `#' a partire da inizio riga.  Questa pure:
    bar #
L'espressione che ti ho suggerito dice che, in sostanza, tra inizio e
fine riga ci puo` essere un numero qualunque di caratteri eccetto `#'.
Massimiliano

 
Però questa leva anche una riga tipo:
Utile_e_interessante_opzione="<##### CIAO A TUTTI!!! #####>";
dopo diversi e ripetuti esperimenti ho tratto le seguenti conclusioni: 
La forma [^<char>] con egrep funziona solo se non è preceduta 
nell'espressione da *, + o ? mentre non è in pratica utilizzabile in altri 
casi.
Questo perchè a quanto pare la forma ^A*[^B] non matcha 0 o più A seguite da 
qualsiasi cosa tranne B ma viene interpretata come ^A*|^[^B], ossia 
qualsiasi cosa inizi con 0 o più A (in pratica tutto...) *oppure* che *non* 
inizi con B, il che spiega anche il comportamento strano dell'espressione 
che avevo scritto io. Curioso che una roba tipo ^A[^B] invece lavori 
correttamente.
A questo punto credo sia un bug oppure qualcosa non implementato in egrep, 
perchè tutte le espressioni che ho scritto che non contengano negazioni 
funzionano alla perfezione come da manuale. Per esercitarmi ho buttato giù 
un'espressione che beccasse righe contenti solo numeri, in qualsiasi forma, 
con o senza punto decimale e in forma scientifica o meno, con segni + e - 
opzionali, è venuta un mostro ma funziona:
^[\+|-]?[0-9]+\.?[0-9]*(e|E|e\+|e-|E\+|E-)?[0-9]+$|^[\+|-]?[0-9]$


 ^[\+|-]?[0-9]+\.?[0-9]*(e|E|e\+|e-|E\+|E-)?[0-9]+$|^[\+|-]?[0-9]$
Quasi.  Fara` il match anche di `|2.2'.  Probabilmente intendevi:
^(\+|-)...
Con il gruppo anziche' il range come hai fatto per (e|E ...)
Ad ogni modo, gran bella cosa le regexp. :-)
Massimiliano

 ^(\+|-)...
Wops!! Ehm... In origine era ^[\+-] ma chissà perché m'ero messo in testa 
che un "or" in mezzo ci stava bene... 
