[regexp bash] zoek alle woorden met 3 verschillende klinkers

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

  • BKJ
  • Registratie: April 2000
  • Laatst online: 27-10-2025
Ik heb een tekst met daarin woorden (d'uh) en ik wil graag alle woorden selecteren die 3 verschillende klinkers hebben (of iig 2 verschillende met de 2 gelijke niet naast elkaar):

bv:

eieren
aaien
uien

Nu wil ik tussen die laatste 2 klinkers een speciaal teken neerzetten. Zeg # ofzow...

Hoe doe ik dit? Ik heb al gekloot met sed en tr maar ik weet ff niet waar ik moet beginnen.

Kamer huren


  • Triggy
  • Registratie: September 2004
  • Laatst online: 20:51
Misschien is dit wel handig voor jou, de Advanced Bash Scripting Guide. Heb daar zelf ook al heel vaak nuttige zaken uit gehaald.

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Zo?
code:
1
sed -r 's/([a-z]{2})$/#\1/gi' input > output

Weet ik niet zeker hoor, is gewoon een gokje :P

edit:
EOL vergeten 8)7

[ Voor 25% gewijzigd door Wolfboy op 09-12-2004 00:31 ]

Blog [Stackoverflow] [LinkedIn]


  • BKJ
  • Registratie: April 2000
  • Laatst online: 27-10-2025
Wolfboy schreef op donderdag 09 december 2004 @ 00:29:
Zo?
code:
1
sed -r 's/([a-z]{2})$/#\1/gi' input > output

Weet ik niet zeker hoor, is gewoon een gokje :P

edit:
EOL vergeten 8)7
Hmmm...die werkt niet...(ook nogal dom gecopyed...)

Ik lees die van jou als volgt:

Zoek 2 occurences achterelkaar van a-z (ik wil alleen maar klinkers) en vervang de de 1e door # plus de 1e.

Kamer huren


Verwijderd

Ik denk niet dat je de voorwaarde `geen twee dezelfde naast elkaar' kunt realiseren met regexen... en als je gewoon 3 klinkers wilt (Perl syntax):

code:
1
|\W (\w* [aeiou]{3} \w*) \W|ix


...zou het moeten doen. Je kunt er groeperende haakjes in mixen om daarna precies te vervangen zoals jij wilt.

En ik weet verder niet wat je in Bash kunt, maar in een èchte taal (PHP en Python iig, en Perl vast ook wel), kun je replacen met een callback functie. Dus je kunt het gros filteren met de regex en daarna de specifieke conditie `geen twee dezelfde klinkers naast elkaar' laten controleren door de callback functie.

  • BKJ
  • Registratie: April 2000
  • Laatst online: 27-10-2025
Verwijderd schreef op donderdag 09 december 2004 @ 01:39:
Ik denk niet dat je de voorwaarde `geen twee dezelfde naast elkaar' kunt realiseren met regexen... en als je gewoon 3 klinkers wilt (Perl syntax):

code:
1
|\W (\w* [aeiou]{3} \w*) \W|ix
Volgens mij voldoet het feit, zat ik me net te bedenken, dat er 3 klinkers zijn ook wel:

code:
1
sed -r 's/([aeoui]{3})/&#/g' test.txt


Alleen ik wil graag die # TUSSEN de klinkers in en niet erna... Hoe?

Kamer huren


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
hitchhacker schreef op donderdag 09 december 2004 @ 02:31:
Volgens mij voldoet het feit, zat ik me net te bedenken, dat er 3 klinkers zijn ook wel:
3 klinkers op een rij:
code:
1
2
3
4
5
$ sed -r 's/([aeiou]{2})([aeiou])/\1#\2/g' test.txt
ei#eren aa#ien
ui#en woord apen
koe#ieu#ier
koe#ienui#ers


Afhankelijk van wat je wilt doen is deze misschien handiger...
code:
1
2
3
4
5
6
$ sed -r 's/([aeiou]{2})([aeiou][^aeiou])/\1#\2/g' test.txt
ei#eren aai#en
ui#en woord apen
koeieui#er
koei#enui#ers
$

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


  • BKJ
  • Registratie: April 2000
  • Laatst online: 27-10-2025
_Squatt_ schreef op donderdag 09 december 2004 @ 03:10:
[...]


3 klinkers op een rij:
code:
1
2
3
4
5
$ sed -r 's/([aeiou]{2})([aeiou])/\1#\2/g' test.txt
ei#eren aa#ien
ui#en woord apen
koe#ieu#ier
koe#ienui#ers


Afhankelijk van wat je wilt doen is deze misschien handiger...
code:
1
2
3
4
5
6
$ sed -r 's/([aeiou]{2})([aeiou][^aeiou])/\1#\2/g' test.txt
ei#eren aai#en
ui#en woord apen
koeieui#er
koei#enui#ers
$
TOP! Het werkt. Alleen 1 probleem. Het gaat om het tellen van lettergrepen (elke lettergreep heeft exact 1 rij van klinkers) alleen gaat dat dus niet op bij uien en aaien etc etc. Het vinden van het juiste aantal lettergrepen bij uien kan bv door ipv # een medeklinker er neer te gooien. Helaas gaat het voor koeieuier niet op.....2x je regexp erover heen werkt weer wel want er is immers nog een rij met 3 klinkers over...daar ga ik nog ff over nadenken...ideeen?

Kamer huren


  • BKJ
  • Registratie: April 2000
  • Laatst online: 27-10-2025
Verwijderd schreef op donderdag 09 december 2004 @ 01:39:
Ik denk niet dat je de voorwaarde `geen twee dezelfde naast elkaar' kunt realiseren met regexen... en als je gewoon 3 klinkers wilt
Echt niet? Dat zou jammer zijn van regexp....

Kamer huren


Verwijderd

hitchhacker schreef op donderdag 09 december 2004 @ 16:16:
[...]


Echt niet? Dat zou jammer zijn van regexp....
Nou ja, natuurlijk wel, maar dan bedoel ik, niet zonder alle mogelijkheiden te enumereren B).

  • BKJ
  • Registratie: April 2000
  • Laatst online: 27-10-2025
Verwijderd schreef op donderdag 09 december 2004 @ 17:05:
[...]


Nou ja, natuurlijk wel, maar dan bedoel ik, niet zonder alle mogelijkheiden te enumereren B).
Dus niet bv een match met: 2e karakter niet gelijk aan 1e?

Kamer huren


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
hitchhacker schreef op donderdag 09 december 2004 @ 17:30:
Dus niet bv een match met: 2e karakter niet gelijk aan 1e?
Ja en nee. Je kunt wel doen:
code:
1
/([aeiou])[^\1]/

Oftewel een klinker gevolgd door een teken wat niet de gematchte klinker is, maar 'en' of 'ab' voldoen daar ook aan.

Jij wilt echter: "Eén van [aeiou] gevolgd door ([aeiou] minus het eerder gematchte teken)."

Iets dergelijks lukt (volgens mij) met een regex niet, nu ondersteunt sed wel het een en ander aan controlstructures, maar zelf zou ik het dan liever oplossen in Ruby (persoonlijke voorkeur) of Perl/Python (staan op meer systemen geïnstalleerd).

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


  • BKJ
  • Registratie: April 2000
  • Laatst online: 27-10-2025
_Squatt_ schreef op donderdag 09 december 2004 @ 20:07:
[...]

Jij wilt echter: "Eén van [aeiou] gevolgd door ([aeiou] minus het eerder gematchte teken)."
Maar [aeoui] min het gematchte teken is toch precies het complement van alle medeklinkers plus de gematchte?

Nu nog een korte regexp...iemand ideeën?

Denk er maar ff over ;)

[ Voor 8% gewijzigd door BKJ op 09-12-2004 22:49 ]

Kamer huren

Pagina: 1