[sed] Matchen op (

Pagina: 1
Acties:

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Ik probeer sed te laten matchen op het ( teken.

Simpel escapen van de ( werkt niet.

Ik heb al geprobeerd op Google te zoeken, maar daar kun je niet op ( zoeken. Op GOT vond ik ook niets hierover, en ook info sed gaf mij niet de goede informatie.

Weet iemand hier de oplossing voor?

Ik ontken het bestaan van IE.


Verwijderd

Hoe ziet je expressie er precies uit? Voer je deze in een shell uit? Zo ja, dan haalt de shell waarschijnlijk de escape van ) weg. Probeer eens dubbele aanhalingstekens om je expressie te zetten.

Post het commando/relevant deel van het script eens. Overigens kun je bij Google wel zoeken op "sed special characters" of "sed character escaping" of iets dergelijks. Wees creatief!

  • frim
  • Registratie: Augustus 2001
  • Niet online
de ( hoef je niet te escapen:

Singapore:~ frim$ echo "ge(ukt" | sed 's/(/l/'
gelukt


de ge-escapede variant gebruik je wel om te groupen. In perl is dit trouwens net andersom.

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
OK, het is officiëel, ik ben een idioot.

Dingen escapen zit er bij mij zo ingebakken, dat ik het niet eens zonder geprobeerd heb.

Zonder escapen werkt het inderdaad prima.

Ik ontken het bestaan van IE.


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Het wil toch nog niet helemaal lukken.

Omdat ik ook gebruik wil maken van negative lookbehinds, heb ik besloten te switchen naar de -R mode (perl mode), wat ook normalere regular expressions geeft.

Ik probeer een aantal javascript-regeltjes te parsen, een voorbeeldje:

JavaScript:
1
    topic('696799','Tags + Betekenissen.','faqredl.gif','6','Dark_Killah','77910','0','1526','','','04-05-2005 15:14','0','1115212460','1115212460','25','1');


Zoals je waarschijnlijk begrijpt, worden de waarden gesplitst op ',' . Er kunnen echter ook escapede (?) ' tekens inzitten, en die wil ik niet hebben, vandaar een negative lookbehind:

code:
1
cat topics | ssed -R "s/^    topic\('([0-9]*)','(.*?)(?<!\\)'/\1;\2;/g" > topics2


Bash gaat dan zeuren over niet gevonden events, door die ! dus die escape ik ook eventjes:

code:
1
cat topics | ssed -R "s/^    topic\('([0-9]*)','(.*?)(?<\!\\)'/\1;\2;/g" > topics2


Maar dan krijg ik van ssed een pattern error. Als ik de lookbehind weglaat, werkt het wél, maar dan gaat het dus bij sommige regels mis.

Ik zie echt niet wat ik fout doe, maar ik ben natuurlijk ook een idioot ;) .

Ik ontken het bestaan van IE.


Verwijderd

Met een uitroepteken tussen quotes escapen heb ik ook al eens zitten prutsen:
code:
1
2
3
4
koning-robot:~ tim$ echo "!"
-bash: !: event not found
koning-robot:~ tim$ echo "\!"
\!

Zonder aanhalingstekens geen problemen... De bash-manual zegt dat als je achter het uitroepteken een whitespacekarakter, = of ( zet, het uitroepteken niet als speciaal wordt gezien. Je kunt dus proberen achter de ! een spatie te zetten met {0} erachter of iets dergelijks.

[ Voor 4% gewijzigd door Verwijderd op 16-10-2005 16:13 ]


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Dat trucje met die spatie werkte overigens niet, maar ik ben erachter dat als je het in een shellscript stopt, history expansion standaard uitstaat, en je dit probleem dus niet hebt.

Toch bedankt voor de reactie :) .

Ik ontken het bestaan van IE.

Pagina: 1