Newsgroup: it.comp.os.linux.sys
Titolo: Regular Expression

Ciao a tutti,
 vi pongo un quesito da 'smanettoni'. ;)
C'è un modo nelle regexp per fare il match di un pattern _e_ di un altro su
un file/input che sia? Ovvero ad esempio:
#> cat file1.txt
 bla blo
 bla bla
 bla ble
se io voglio SOLO la riga "bla blo" potrei fare:
#> grep bla file1.txt | grep blo
 bla blo
e fino a qua ok. Si lo so che ci sono altri 20 metodi, that's just an
example ;) Non voglio *alternative* , è una curiosità che mi è venuta sulle
reg-exp.
Perchè :
#> egrep 'bla|blo' file1.txt
mi da le occorrenze di 'bla' o di 'blo', ovvero tutte le righe nell'esempio.
Ci vorrebbe qualcosa tipo
#> egrep '(bla)&(blo)' file1.txt
Non so se sono stato spiegato bene (cit. Sconsolata). ;)
Tx,
 Dave
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 #> egrep '(bla)&(blo)' file1.txt
egrep "bla.*blo" file1.txt
non va bene?
-- 
wash the blood from your hands
bury your secrets in the sand
and forget

 #> egrep '(bla)&(blo)' file1.txt
in posix, non direi. In perl si, e la parola chiave e` backreference.
Pero`, l'uso delle backreference e` quello di riutilizzare il match, non
tanto di farci altre ricerche, percui, verosimilmente, stai sbagliando
approccio.
Per altro, il backreference e` timeconsuming rispetto all'engine delle
regex.
La regex piu` sensata per il tuo caso e` quindi:
/bla.+blo/
o addirittura /bla blo/ se sai che le due parole sono separate da uno
spazio.
-- 
                          Maurizio - Tannoiser - Lemmo
                 Founder Member of ERLUG 
http://erlug.linux.it
-------------------------------------------------------------------------------
Why is "abbreviation" such a long word?


nel caso che mi ha fatto nascere il dubbio non c'era occorrenza fissa fra i
due patter, quindi /bla blo/ è da scartare, sarebbe in realtà più giusta
/bla.*blo/ come dice il buon Skull ma il senso della domanda non era quello!
;))
Io volevo proprio sapere se le regexp supportano l'AND condizionale.
Certo che si può usare bla.*blo per risolvere, ma anche un doppio grep o un
"if" o un awk van benone. ;)
Ho trovato una specie di manuale e pare che comunque l'AND non esista nelle
regexp ... l'unica via è usare il punto o altri sistemi .


 non va bene?
Giusto per completezza:
egrep '(bla.*blo)|(blo.*bla)'
Alternativa:
grep bla file1.txt | grep blo
Ciao,
-- 
       Roberto Divia`             Love at first sight is one of the greatest
       =============             labour-saving devices the world has ever seen.
Mailbox: C02110                 CERN-European Organization for Nuclear Research
E-mail: 
Robert...@cern.ch
           CH-1211 GENEVE 23, Switzerland

 Ciao,
Ciao e grazie a tutti!
 Davide


 alternative! eheh ;)))))
Volente o nolente, l'aternativa ti e` arrivata ;-)


 "if" o un awk van benone. ;)
le regex del perl, sono uno strumento del perl. L'and in perl c'e`.
Esattamente come richiamare due volte un programma (che non e` una
feature del programma).
-- 
                          Maurizio - Tannoiser - Lemmo
                 Founder Member of ERLUG 
http://erlug.linux.it
-------------------------------------------------------------------------------
Security-wise, NT is a server with a "Kick me" sign taped to it.

 Volente o nolente, l'aternativa ti e` arrivata ;-)
OK, non volevo essere cattivo. Fammi spiegare. Noi siamo in collegamento
- indiretto, ma sempre in collegamento - su un tema che potrebbe interessare
altri. Questi altri non intervengono, ma possono leggere in qualunque momento
la nostra "conversazione" per risolvere un problema o semplicemente per
imparare qualcosa di nuovo - o confermare cose gia` conosciute. Discorsi del
tipo: "voglio una risposta privata" o "non voglio divagazioni ma solo risposte
dirette" bloccano sul nascere la diffusione di informazione potenzialmente
interessante. Ecco perche` preferisco talvolta andare leggermente fuori tema
oppure rispondere contro richieste esplicite delle controparti. Non me ne
volere, niente di personale...


 (autoquotandomi).
Uè.. che c'entro io... :-D
E comunque, tu non matchi blablo :-P
Cmq, volendo entrare nel merito, son d'accordo con Mizio.
il match nelle regexp è solo ed esclusivamente una funzione che torna
booleano (escludendo le funzionalità di backreference citate, che tornano
utili per altre cose - e sono casi particolari) partendo da una stringa e
una espressione.
Di suo, pertanto, non vedo perchè dovrebbe supportare qualcosa di simile a
un "and", nè più nè meno di come non me lo aspetto da un "="...
Volendo proprio (in perl) "andare",
if ( $VAR =~ /bla/ )&&( $VAR =~ /blo/ ) {}
che, a ben vedere, dovrebbe anche essere più veloce di /bla.*blo/ (se
questo non è ottimizzato, cosa che onestamente ignoro..), ma è un'altra
cosa...


 un "and", nč piů nč meno di come non me lo aspetto da un "="...
s/=/==/
tanto per rimanere nel merito...


 Non so se sono stato spiegato bene (cit. Sconsolata). ;)
Ad essere sincero no :-) non ho capito cos'e' che vuoi, e perche'
grep "bla blo" file1.txt
non vada bene
se puoi essere piu' chiaro....
ciao

 cosa...
.* dovrebbe essere ottimizzato, ma l'if e` sicuramente e` piu` efficente
e veloce di /(bla).*(blo)/ che crea due backreference, a meno di non
scriverlo cosi`:
/(?:bla).*(?:blo)/
se non ricordo male, o appunto meglio ancora /bla.*blo/ (o /bla.+blo/ se
non si vuole matchare blablo, come da esempio primo post).
-- 
                          Maurizio - Tannoiser - Lemmo
                 Founder Member of ERLUG 
http://erlug.linux.it
-------------------------------------------------------------------------------
Syntactic sugar causes cancer of the semicolon.

 Ciao,
Ciao!
 Davide
PS: comunque apprezzo sempre la disponibilità delle persone e cerco sempre
di essere di aiuto se posso, quindi anche se (come dici tu) vai fuori tema è
per un buon fine, quindi va bene! ;)


 - stai usando un ambito sbagliato
beh - considerando che non ti ho detto qual'era l'ambito e il problema mi
sembra un po' azzardato da parte tua dirmi che sbaglio
approccio/strumento/ambito! Su che basi? ;)
Anyway, l'esempio era (come dice la parola) solo un esempio. Non voglio
stare a spiegarti il caso che mi ha fatto venire questo dubbio (troppo
lungo) ma in senso molto generale volevo solo sapere se si poteva fare o no.
Al di la di tutte le considerazioni di "č meglio cosě" "cosě č piů
ottimizzato" etc ... pura curiositŕ chiesta a chi ne sa ben lungi piů di me!
Massima stima e cortesia come sempre,


 Massima stima e cortesia come sempre,
La mia per le persone a cui rispondo, non e` mai in discussione
(diversamente non rispondo, facci caso. :)).
-- 
                          Maurizio - Tannoiser - Lemmo
                 Founder Member of ERLUG 
http://erlug.linux.it
-------------------------------------------------------------------------------


>cosa...
Sebbene stia lavorando con perl (e non mi piace :-) ) mi sorge un dubbio...
le reg ex non sono greedy di default?
cioe' /bla.*blo/ non dovrebbe matchare *qualunque cosa* inizi con bla?
non si dovrebbe scrivere /bla.*?blo/
Ma poiche' come ho anticipato "il perl non mi piace" magari sbaglio :-)
byez

 significa nulla, ma lasciamo perdere).
A parte il "condizionale", perche` non avrebbe senso
avere un "and", cioe` una espressione che risulta
vera quando si trova sia la regexp A che la regexp B?
Da notare che l'operatore "|" (or) non sarebbe proprio
standard... :-)
bye,
-- 
   Piergiorgio Sartor

 Piergiorgio Sartor
Ciao ,


 Ma poiche' come ho anticipato "il perl non mi piace" magari sbaglio :-)
ri-blasfemo. :)
-- 
                          Maurizio - Tannoiser - Lemmo
                 Founder Member of ERLUG 
http://erlug.linux.it
-------------------------------------------------------------------------------
Lusers: can't live with them, don't get paid without them.

 standard... :-)
:)
-- 
                          Maurizio - Tannoiser - Lemmo
                 Founder Member of ERLUG 
http://erlug.linux.it
-------------------------------------------------------------------------------


 Questo non e` in discussione. Ma sono appunto _due_ regex.
Calma, regexp supporta il nesting, quindi non
ha senso distinguere se e` uno o sono due.
Si dovrebbero poter fare cose tipo:
(((pippo.*)+).?)|((pluto?)*)
bye,
-- 
   Piergiorgio Sartor

 ha senso distinguere se e` uno o sono due.
IMHO, ci stiamo "arrotolando".
L'esempio che faceva il nostro amico era: "vorrei fare qualcosa tipo:
grep /pippo/ file | grep /pluto/"
E per questo parlava di AND, e per questo parlava di condizionalita`.
La cosa che ci va piu` vicino, e` una ricerca su backreference, magari
usando $^N per catturare il risultato del submatch, ma mi pare
un'inutile complicazione.
Si puo` scrivere una regex piu` utilizzabile, e piu` leggibile (e meno
timeconsuming).
Si puo`, se all'interno di uno script, operarare due applicazioni
differenti (che e` anche la cosa piu` simile all'esempio).
E lui ci ha tenuto a chiarire che il suo e` un quesito di metodo non di
merito.
Se ho frainteso qualcosa, chiedo venia.
-- 
                          Maurizio - Tannoiser - Lemmo
                 Founder Member of ERLUG 
http://erlug.linux.it
-------------------------------------------------------------------------------
We'll burn that bridge when we come to it.

 ri-blasfemo. :)
:-) ognuno e' libero di scegliersi la sua croce, a te piace il perl :-)
byez

 non di merito.
right
.. non ho capito una cosa però, tu dici:
<cit>
Si puo`, se all'interno di uno script, operarare due applicazioni
differenti (che e` anche la cosa piu` simile all'esempio).
</cit>
ma non ho capito cosa intendi con "operare due applicazioni differenti" ..
mi sento molto 'utonto' ma che ci vuoi fare, siamo nati per soffrire.
 Dave
--------------------
Da che mondo e' mondo, il sergente e' una persona che urla!
--------------------


 un'inutile complicazione.
Ma credo che la proposta"
(bla.*blo)|(blo.*bla)
dovrebbe essere OK, la complicazione potrebbe
essere qualora si voglia escludere "|", oppure
qualora si voglia fare l'and di 10 espressioni!
bye,
-- 
   Piergiorgio Sartor

 mi sento molto 'utonto' ma che ci vuoi fare, siamo nati per soffrire.
Perdonami, sono io che ho utilizzato espressioni ambigue.
Intendo dire, che puoi, all'interno di uno script, dare ad una
variabile, il valore di un match (il primo), e su questa, operare
un'altro match, in maniera analoga al doppio grep.
Una cosa tipo:
$_ = "la tua stringa";
# primo match
/(tua.*)/;
$_ = $1;
# secondo match, sul risultato, visto che ora $_ vale il risultato di
# prima.
/(stringa)/;
$result = $1;
-- 
                          Maurizio - Tannoiser - Lemmo
                 Founder Member of ERLUG 
http://erlug.linux.it
-------------------------------------------------------------------------------
Real programmers don't comment. What was hard to write should be hard to read.

 Real programmers don't comment. What was hard to write should be hard to
read.
Real programmers are just an invention of your mind.... ;)


 #> egrep '(bla)&(blo)' file1.txt
Hint: leggi di de Morgan:
A&B <> ~(~Av~B) (leggi "AeB equivale a non(nonA o nonB)")
AvB <> ~(~A&~B) (leggi "AoB equivale a non(nonA e nonB)")
Detto questo le regexp sono la mia dannazione e non sono ancora del tutto convinto che non siano creazione del demonio, indi passo la mano..
ditemi perche': 
$egrep a?
aaa
aaa
non dovrebbe essere al massimo un occorenza? nn capisco...
Luca

 Luca
Perchè il "?" vuol dire 'una o più volte'. Nelle regexp il significato del
"?" o ad esempio del "." sono diversi da altri linguaggi.
Il punto ad esempio è un po come il "?" in DOS ... si può dire DOS qui? Ho
detto una parolaccia?! ;)
es:
echo "aaa
asa
ab
a
" | egrep 'a.a'
aaa
asa
Perchè vuole che ci sia un carattere fra le 2 'a' ...
echo "aaa
asa
ab
a" | egrep 'a?'
aaa
asa
ab
a
questo 'meccia' tutto perchè il significato di "?" è zero o più occorrenze.
HTH,
 Dave


> Perchè il "?" vuol dire 'una o più volte'.
 Mi correggo: "zero o più volte", sotto l'avevo scritto giusto! ;)


 non dovrebbe essere al massimo un occorenza? nn capisco...
No, il simbolo "?" significa 0 od 1 volta la precedente
espressione.
Il caso "aaa" ha ben 3 occorrenze di questo match.
Le regexp hanno l'or (non ordinato) di default.
Cercare al massimo una sola esclusiva occorrenza non
credo sia cosi` banale.
bye,
-- 
piergiorgio

 non dovrebbe essere al massimo un occorenza? nn capisco...
perche`:
"grep, egrep, fgrep - print lines matching a pattern" (dalla prima riga
della man page).
egrep stampa la "linea" (tutta).
-- 
                          Maurizio - Tannoiser - Lemmo
                 Founder Member of ERLUG 
http://erlug.linux.it
-------------------------------------------------------------------------------
One item could not be deleted because it was missing.

 Certo, ma come fai il "not" con le regexp?
Se puoi ricondurlo ad una classe, con ^.


 Se puoi ricondurlo ad una classe, con ^.
Non mi risulta si possa fare un not("bao"), per esempio.
Si puo` fare [^bao], ma non funziona, ovviamente.
bye,
-- 
piergiorgio

 bli " | egrep [^bao]
bua
bia
bla
blo
bli
e l'output mi contraddice .... leggendo qualche manualetto avevo inteso che
"bao" sarebbe stato interpretato come una serie di caratteri "b" + "a" + "o"
presi separatamente, invece pare che la prenda come una parola, si parla
sempre infatti di "elenco" e fanno anche l'esempio di
egrep 'aiut[^io]'
per non fare il match di aiuto e aiuti .... si insomma, la teoria non mi
torna nella pratica .... Volevo darti ragione ma per ora non posso! ;)


 Premesso che stavo per rispondere dandoti ragione,
Premesso che non avevo ancora acceso i neuroni, torno a darti ragione e mi
scuso per la ca@#ata! ;)
