egrep en NOT?

Pagina: 1
Acties:
  • 133 views sinds 30-01-2008
  • Reageer

  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 15-02 08:23
Misschien een hele domme vraag, maar ik kom er maar niet achter...

Stel, ik heb een bestandje test.txt:
code:
1
2
3
jan piet klaas
piet jan
kees piet


Als ik alle regels wil waarin klaas of kees voorkomt, dan doe ik dit:

code:
1
grep -E 'klaas|kees' test.txt


Werkt prima;

Maar nu wil ik alle regels waarin "piet" wel voorkomt, maar niet "jan". Ik kan echter nergens achterhalen hoe ik een NOT kan uitvoeren in een regulier expressie van grep -E.

Ik heb deze referenties al doorgenomen:
http://www.tldp.org/LDP/abs/html/x12482.html
http://heirloom.berlios.de/man/egrep.1.html

Kan iemand me uit mijn lijden verlossen?

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Ben niet zo'n grep expert, maar kun je niet het volgende gebruiken:
code:
1
grep 'piet' test.txt | grep -v 'jan'

De eerste grep pakt alle regels met 'piet', de tweede regel filtert alle regels met 'jan' er uit. Ik neem aan dat het makkelijker kan, maar hoe weet ik zo snel niet ;).

[ Voor 23% gewijzigd door _Squatt_ op 15-04-2004 16:30 . Reden: GMTA :P ]

"He took a duck in the face at two hundred and fifty knots."


  • sebas
  • Registratie: April 2000
  • Laatst online: 16-12-2025
code:
1
grep piet test.txt|grep -v jan

lijkt me zo 1-2-3 het makkelijkste.

[ Voor 2% gewijzigd door sebas op 15-04-2004 16:31 . Reden: grrrrr ... khad die slok koffie n paar sec later moeten nemen ;) ]

Everyone complains of his memory, no one of his judgement.


  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 15-02 08:23
Dank je.

Dit werkt inderdaad op zich wel, maar weet iemand een oplossing met een reg exp.? Ik zou het ook in andere situaties dan de geschetste willen weten :)

[ Voor 9% gewijzigd door dirkpostma op 15-04-2004 16:43 ]


  • RvdH
  • Registratie: Juni 1999
  • Laatst online: 19-02 14:54

RvdH

Uitvinder van RickRAID

code:
1
2
3
4
5
6
7
rick@debian:~$ cat test.txt 
jan piet klaas
piet jan
kees piet
rick@debian:~$ egrep '!jan klaas|kees' test.txt 
kees piet
rick@debian:~$

  • Wilke
  • Registratie: December 2000
  • Laatst online: 10:24
Dat kan niet met een perl regexp denk ik.

  • sebas
  • Registratie: April 2000
  • Laatst online: 16-12-2025
RickJansen schreef op 15 april 2004 @ 16:50:
code:
1
2
3
4
5
6
7
rick@debian:~$ cat test.txt 
jan piet klaas
piet jan
kees piet
rick@debian:~$ egrep '!jan klaas|kees' test.txt 
kees piet
rick@debian:~$
code:
1
2
3
4
5
6
7
8
9
sebas@neo tmp $ cat test.txt
piet klaas kees
kees klaas jan
jan klaas
piet jan
kees klaar
sebas@neo tmp $ egrep '!jan|piet' test.txt
piet klaas kees
piet jan

eeh, mis ik iets?

Everyone complains of his memory, no one of his judgement.


  • richardt
  • Registratie: Mei 2002
  • Laatst online: 08-03-2025
Een eenvoudige grep is daarvoor niet krachtig genoeg. Je kunt niet een combinatie van een match en een inverse match in 1 grep-regular expression vangen. De combinatie met de pipe lijkt me ook de makkelijkste oplossing.

Als je toevallig ook sed hebt, is er nog wel iets meer mogelijk:
code:
1
sed -n '/jan/d;/piet/p' test.txt

  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 15-02 08:23
Oke, allen bedankt. Ik denk dat ik voorlopig met de pipe altijd wel uit de voeten kan.
Pagina: 1