Thread View: be.comp.programming
13 messages
13 total messages
Started by Roel Schroeven
Fri, 23 May 2003 09:35
Regex: hoe iets te excluden?
Author: Roel Schroeven
Date: Fri, 23 May 2003 09:35
Date: Fri, 23 May 2003 09:35
27 lines
1621 bytes
1621 bytes
Ik zou door een hele hoop files willen zoeken op 'bar', maar niet 'foobar'.
Dus
blabla foobar blabla
zou niet mogen matchen,
maar
blabla bar blabla
en zelfs
blabla foobar blabla bar blabla
zouden wel moeten matchen.
Zonder die laatste zou het gemakkelijk kunnen met grep bar | grep -v
foobar, maar dat kan hier dus niet.
Ik heb al geprobeerd met
grep "\(foo\)\{0\}bar"
maar dat werkt niet: foobar wordt toch nog gematcht. Iemand een idee?
--
"Codito ergo sum"
Roel Schroeven
Re: Regex: hoe iets te excluden?
Author: Roel Schroeven
Date: Fri, 23 May 2003 09:44
Date: Fri, 23 May 2003 09:44
14 lines
1497 bytes
1497 bytes
Roel Schroeven wrote:
> Ik heb al geprobeerd met
>
> grep "\(foo\)\{0\}bar"
>
> maar dat werkt niet: foobar wordt toch nog gematcht. Iemand een idee?
grep "[^f][^o][^o]bar" doet het wel, maar ik zou denken dat het
eleganter moet kunnen.
--
"Codito ergo sum"
Roel Schroeven
Re: Regex: hoe iets te excluden?
Author: Roel Schroeven
Date: Fri, 23 May 2003 09:47
Date: Fri, 23 May 2003 09:47
20 lines
1886 bytes
1886 bytes
Roel Schroeven wrote:
> Roel Schroeven wrote:
>
>> Ik heb al geprobeerd met
>>
>> grep "\(foo\)\{0\}bar"
>>
>> maar dat werkt niet: foobar wordt toch nog gematcht. Iemand een idee?
>
>
> grep "[^f][^o][^o]bar" doet het wel, maar ik zou denken dat het
> eleganter moet kunnen.
Het werkt zelfs niet helemaal: als bar aan het begin van de lijn staat
gaat het fout.
--
"Codito ergo sum"
Roel Schroeven
Re: Regex: hoe iets te excluden?
Author: Gunter Schelfhout
Date: Fri, 23 May 2003 09:49
Date: Fri, 23 May 2003 09:49
19 lines
1522 bytes
1522 bytes
Roel Schroeven wrote:
[knip]
> Ik heb al geprobeerd met
>
> grep "\(foo\)\{0\}bar"
>
> maar dat werkt niet: foobar wordt toch nog gematcht. Iemand een idee?
>
grep "\bbar\b"
\b -> wordboundary
Dus grep gaat nu greppen op het woord bar slechts als dit voorkomt als een
zelfstandig woord.
--
Blood, sweat & tears
Re: Regex: hoe iets te excluden?
Author: Roel Schroeven
Date: Fri, 23 May 2003 09:56
Date: Fri, 23 May 2003 09:56
29 lines
1973 bytes
1973 bytes
Gunter Schelfhout wrote:
> Roel Schroeven wrote:
>
> [knip]
>
>
>>Ik heb al geprobeerd met
>>
>>grep "\(foo\)\{0\}bar"
>>
>>maar dat werkt niet: foobar wordt toch nog gematcht. Iemand een idee?
>>
>
>
> grep "\bbar\b"
>
> \b -> wordboundary
>
> Dus grep gaat nu greppen op het woord bar slechts als dit voorkomt als een
> zelfstandig woord.
Het zou ook moeten matchen als het in een woord voorkomt. Of in het
begin van een regel, of op het einde, of allebei; altijd eigenlijk,
alleen niet als 'foo' er vlak voor staat.
--
"Codito ergo sum"
Roel Schroeven
Re: Regex: hoe iets te excluden?
Author: Gunter Schelfhout
Date: Fri, 23 May 2003 10:02
Date: Fri, 23 May 2003 10:02
22 lines
1664 bytes
1664 bytes
Roel Schroeven wrote: [knip] >> >> grep "\bbar\b" >> >> \b -> wordboundary >> >> Dus grep gaat nu greppen op het woord bar slechts als dit voorkomt als >> een zelfstandig woord. > > Het zou ook moeten matchen als het in een woord voorkomt. Of in het > begin van een regel, of op het einde, of allebei; altijd eigenlijk, > alleen niet als 'foo' er vlak voor staat. Dat is niet wat uw voorbeeld weergaf. ;-) grep "[^(foo)]bar" -- Blood, sweat & tears
Re: Regex: hoe iets te excluden?
Author: Roel Schroeven
Date: Fri, 23 May 2003 10:05
Date: Fri, 23 May 2003 10:05
31 lines
2282 bytes
2282 bytes
Gunter Schelfhout wrote: > Roel Schroeven wrote: > > [knip] > > >>>grep "\bbar\b" >>> >>>\b -> wordboundary >>> >>>Dus grep gaat nu greppen op het woord bar slechts als dit voorkomt als >>>een zelfstandig woord. >> >>Het zou ook moeten matchen als het in een woord voorkomt. Of in het >>begin van een regel, of op het einde, of allebei; altijd eigenlijk, >>alleen niet als 'foo' er vlak voor staat. > > > Dat is niet wat uw voorbeeld weergaf. ;-) Ik had er spaties rondgezet voor de 'duidelijkheid', maar achteraf bekeken was dat toch niet zo duidelijk :) > grep "[^(foo)]bar" Zooo simpel ... ik had het moeten weten ... -- "Codito ergo sum" Roel Schroeven
Re: Regex: hoe iets te excluden?
Author: Walter Baeck
Date: Mon, 26 May 2003 10:41
Date: Mon, 26 May 2003 10:41
35 lines
2263 bytes
2263 bytes
> >> grep "\bbar\b"
> >>
> >> \b -> wordboundary
Werkte dit ook niet met
grep '\<bar\>' ?
Maar, zoals OP al zei, zoeken op woord-boundaries is hier geen oplossing.
> grep "[^(foo)]bar"
Bij mij werkt dit niet (opgeroepen vanuit csh, Solaris 5.8,
zowel /bin/grep als /usr/xpg4/bin/grep ). De ronde haakjes
worden namelijk als eerste geevalueerd, zodat het resultaat
hetzelfde wordt als voor
grep "[^foo]bar"
wat leidt tot problemen:
- bar aan begin van regel wordt niet weerhouden
- bv. "fuifbar" wordt onterecht geweigerd
Mijn oplossing zou dit monsterlijke gedrocht zijn:
grep bar * | sed 's/foobar/ONGEWENST/g' | grep bar | sed 's/ONGEWENST/foobar/g'
Hopelijk weet er iemand iets eleganter.
--
____________
\ / Walter Baeck
\ ALCATEL/ Alcatel Telecom
\ BELL / Broadband Networks Division
\ / Microelectronics Design
\ / E-mail : walter.baeck@alcatel.be
\/ Phone : +32 3 240 73 86
Re: Regex: hoe iets te excluden?
Author: Roel Schroeven
Date: Mon, 26 May 2003 10:46
Date: Mon, 26 May 2003 10:46
33 lines
2357 bytes
2357 bytes
Walter Baeck wrote:
>>>>grep "\bbar\b"
>>>>
>>>>\b -> wordboundary
>
>
> Werkte dit ook niet met
> grep '\<bar\>' ?
>
> Maar, zoals OP al zei, zoeken op woord-boundaries is hier geen oplossing.
>
>
>
>>grep "[^(foo)]bar"
>
>
> Bij mij werkt dit niet (opgeroepen vanuit csh, Solaris 5.8,
> zowel /bin/grep als /usr/xpg4/bin/grep ). De ronde haakjes
> worden namelijk als eerste geevalueerd, zodat het resultaat
> hetzelfde wordt als voor
> grep "[^foo]bar"
> wat leidt tot problemen:
> - bar aan begin van regel wordt niet weerhouden
> - bv. "fuifbar" wordt onterecht geweigerd
Gelukkig werkt het bij mij wel, in de cygwin-versie van grep, en ook in
de zoekfunctie van Borland C++Builder (maar dan in de gewijzigde versie
[^{foo}]bar, hoewel Borland alleen nogal simpele expressions aankan.
--
"Codito ergo sum"
Roel Schroeven
Re: Regex: hoe iets te excluden?
Author: Gunter Schelfhout
Date: Mon, 26 May 2003 11:25
Date: Mon, 26 May 2003 11:25
34 lines
2346 bytes
2346 bytes
Walter Baeck wrote: [knip] > Bij mij werkt dit niet (opgeroepen vanuit csh, Solaris 5.8, > zowel /bin/grep als /usr/xpg4/bin/grep ). De ronde haakjes > worden namelijk als eerste geevalueerd, zodat het resultaat > hetzelfde wordt als voor > grep "[^foo]bar" > wat leidt tot problemen: > - bar aan begin van regel wordt niet weerhouden > - bv. "fuifbar" wordt onterecht geweigerd Wij werken met de GNU-versie van grep en dan werkt het perfect. Ik ken enkel wat van pattern matching die bij Perl toegepast wordt en her en der wat verschilt met bv sed en awk. Bij Perl dienen de haakjes om karakters samen te voegen (en te capturen in de variabelen $1, $2, enz) Blijkbaar denkt uw grep-versie er anders over en geldt dan de negatie van enkel de letter f. Van zodra een string begint met f, is het pattern reeds false. > Mijn oplossing zou dit monsterlijke gedrocht zijn: > > grep bar * | sed 's/foobar/ONGEWENST/g' | grep bar | sed > 's/ONGEWENST/foobar/g' > > Hopelijk weet er iemand iets eleganter. > grep -ie "bar" <file>| grep -iv "foobar" -- Blood, sweat & tears
Re: Regex: hoe iets te excluden?
Author: Walter Baeck
Date: Tue, 27 May 2003 10:11
Date: Tue, 27 May 2003 10:11
57 lines
3445 bytes
3445 bytes
> > grep "[^(foo)]bar"
> >
> > wat leidt tot problemen:
> > - bar aan begin van regel wordt niet weerhouden
> > - bv. "fuifbar" wordt onterecht geweigerd
>
> Wij werken met de GNU-versie van grep en dan werkt het perfect.
Ik heb de raad van Kris De Decker gevolgd
(uit news:57388f65.0305171657.2f71e9ed@posting.google.com )
en Regex Coach geinstalleerd. Dit is dan blijkbaar niet kompatibel
met jullie GNU-versie van grep; net zoals wat ik in Solaris grep
observeer, faalt de match op de twee situaties die ik aanhaalde.
> Ik ken enkel wat van pattern matching die bij Perl toegepast wordt
> en her en der wat verschilt met bv sed en awk.
> Bij Perl dienen de haakjes om karakters samen te voegen
> (en te capturen in de variabelen $1, $2, enz)
Precies zoals ik het in Solaris sed gebruik.
Gelukkig hebben we toch nog ergens een gemeenschappelijk vertrekpunt :-)
> Blijkbaar denkt uw grep-versie er anders over en geldt dan de negatie van
> enkel de letter f. Van zodra een string begint met f, is het pattern reeds
> false.
Ik vermoed dat grep "[^(foo)]bar hetzelfde is als grep "[^foo]bar"
onder de versie die ik gebruik. Als ik "man regexp" goed begrijp,
dan betekent dit dat er gezocht wordt op een string van precies
4 karakters, van de vorm .bar waarbij er op het puntje geen letter
mag staan die voorkomt tussen in de "exclude list" [^foo].
> > Mijn oplossing zou dit monsterlijke gedrocht zijn:
> >
> > grep bar * | sed 's/foobar/ONGEWENST/g' | grep bar | sed
> > 's/ONGEWENST/foobar/g'
> >
> > Hopelijk weet er iemand iets eleganter.
>
> grep -ie "bar" <file>| grep -iv "foobar"
Dit lijkt me zeker niet de oplossing, aangezien O.P. vermeldde dat
blabla foobar bar blabla
toch WEL moest gematchd worden. Juist, Roel ? Dat maakt het nu net
zo moeilijk..
--
____________
\ / Walter Baeck
\ ALCATEL/ Alcatel Telecom
\ BELL / Broadband Networks Division
\ / Microelectronics Design
\ / E-mail : walter.baeck@alcatel.be
\/ Phone : +32 3 240 73 86
Re: Regex: hoe iets te excluden?
Author: Roel Schroeven
Date: Tue, 27 May 2003 10:35
Date: Tue, 27 May 2003 10:35
64 lines
3750 bytes
3750 bytes
Walter Baeck wrote: >>>grep "[^(foo)]bar" >>> >>>wat leidt tot problemen: >>> - bar aan begin van regel wordt niet weerhouden >>> - bv. "fuifbar" wordt onterecht geweigerd >> >>Wij werken met de GNU-versie van grep en dan werkt het perfect. > > > Ik heb de raad van Kris De Decker gevolgd > (uit news:57388f65.0305171657.2f71e9ed@posting.google.com ) > en Regex Coach geinstalleerd. Dit is dan blijkbaar niet kompatibel > met jullie GNU-versie van grep; net zoals wat ik in Solaris grep > observeer, faalt de match op de twee situaties die ik aanhaalde. > > > >>Ik ken enkel wat van pattern matching die bij Perl toegepast wordt >>en her en der wat verschilt met bv sed en awk. >>Bij Perl dienen de haakjes om karakters samen te voegen >>(en te capturen in de variabelen $1, $2, enz) > > > Precies zoals ik het in Solaris sed gebruik. > Gelukkig hebben we toch nog ergens een gemeenschappelijk vertrekpunt :-) > > > >>Blijkbaar denkt uw grep-versie er anders over en geldt dan de negatie van >>enkel de letter f. Van zodra een string begint met f, is het pattern reeds >>false. > > > Ik vermoed dat grep "[^(foo)]bar hetzelfde is als grep "[^foo]bar" > onder de versie die ik gebruik. Als ik "man regexp" goed begrijp, > dan betekent dit dat er gezocht wordt op een string van precies > 4 karakters, van de vorm .bar waarbij er op het puntje geen letter > mag staan die voorkomt tussen in de "exclude list" [^foo]. > > > >>>Mijn oplossing zou dit monsterlijke gedrocht zijn: >>> >>>grep bar * | sed 's/foobar/ONGEWENST/g' | grep bar | sed >>>'s/ONGEWENST/foobar/g' >>> >>>Hopelijk weet er iemand iets eleganter. >> >>grep -ie "bar" <file>| grep -iv "foobar" > > > Dit lijkt me zeker niet de oplossing, aangezien O.P. vermeldde dat > blabla foobar bar blabla > toch WEL moest gematchd worden. Juist, Roel ? Dat maakt het nu net > zo moeilijk.. Inderdaad. Gelukkug werkt [^(foo)] wel hier. Lastig toch, dat er zo veel verschillen zijn tussen verschillende regex-implementaties. -- "Codito ergo sum" Roel Schroeven
Re: Regex: hoe iets te excluden?
Author: Gunter Schelfhout
Date: Tue, 27 May 2003 11:51
Date: Tue, 27 May 2003 11:51
57 lines
2882 bytes
2882 bytes
Walter Baeck wrote:
[knip]
>
> Ik vermoed dat grep "[^(foo)]bar hetzelfde is als grep "[^foo]bar"
> onder de versie die ik gebruik. Als ik "man regexp" goed begrijp,
> dan betekent dit dat er gezocht wordt op een string van precies
> 4 karakters, van de vorm .bar waarbij er op het puntje geen letter
> mag staan die voorkomt tussen in de "exclude list" [^foo].
idd
>
>> > Mijn oplossing zou dit monsterlijke gedrocht zijn:
>> >
>> > grep bar * | sed 's/foobar/ONGEWENST/g' | grep bar | sed
>> > 's/ONGEWENST/foobar/g'
>> >
>> > Hopelijk weet er iemand iets eleganter.
>>
>> grep -ie "bar" <file>| grep -iv "foobar"
>
> Dit lijkt me zeker niet de oplossing, aangezien O.P. vermeldde dat
> blabla foobar bar blabla
> toch WEL moest gematchd worden. Juist, Roel ? Dat maakt het nu net
> zo moeilijk..
Je hebt gelijk.
Maar deze Perl-oneliner doet w�l zijn werk zoals het moet. ;-)
perl -e 'while(<>) { print if m/(?<!foo)bar/i; }' <file>
Als <file> deze inhoud heeft:
Als bar in een zin voorkomt, moet
het gematcht worden.
Foobar in een zin, is geen match.
Als daarentegen foobar �n bar in een zin voorkomen,
dan is het weer wel geldig.
foobar
bar
Dit geeft:
Als bar in een zin voorkomt, moet
Als daarentegen foobar �n bar in een zin voorkomen,
bar
De regex is:
m/(?<!foo)bar/i
Dit betekent (in Perl, misschien ook in sed en andere) dat alle instanties
van bar gematched worden zolang er g��n foo voorstaat.
(?<!...) betekent "negative lookbehind".
--
Blood, sweat & tears
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads