Regex, dingen vervangen zonder tekst ervoor

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Hoi Hoi


Ik wil een regex schrijven voor een sed expressie om een bepaald woord (laten we zeggen $TOKEN1) te vervangen door $TOKEN2 in een set latex files.
Nou dat is simpel:

code:
1
sed -i "s/$TOKEN1/$TOKEN2/g" *.tex



Echter gaat het hier om een expansie van $TOKEN1, naar $TOKEN2.
Ik wil namelijk $TOKEN1 omzetten in
code:
1
\textit{$TOKEN1}
.


En als dat eenmaal is gebeurd moet dat niet nogmaals gebeuren (anders krijg je \textit{\textit{\textit{$TOKEN1}}} na 3x draaien).
Nu kan ik op zich een regex schrijven die een meervoudige \textit herschrijft naar een enkele, maar dat is ranzig.

Wat ik dus wil is zoiets als dit:

s/!(\textit{)$TOKEN1(})/\textit{$TOKEN1}/g


Dit krijg ik niet voor elkaar. Weet iemand hoe het werkt? Die !(XXX) zou een string moeten negaten. Uiteraard al zonder de braces geprobeerd.
In de release versie komt er ook nog een [ ]* rond $TOKEN1 te staan om spaties te elimineren.


Ik heb zowel met ^ als met ! en ( ) om $TOKEN1 geprobeerd de woorden te laten ontdekken, maar dat lukt niet.
Kan iemand me vertellen waar ik qua denkwijze in de fout ga?

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-09 18:51
Dat uitroepteken zegt me sowieso niets... is jet $TOKEN een gewoon woord of een ingewikkeld patroon?

Ik zou er zelf waarschijnlijk voor kiezen om er zoiets van te maken:
sed 's/\\textit{foo}\|foo/\\textit{foo}/g

Helaas komt foo dan nog wel twee keer in je pattern voor, wat niet heel netjes is natuurlijk, maar ik ben bang dat je daar niet aan ontkomt omdat reguliere talen geen haakjes kunnen matchen.

[ Voor 17% gewijzigd door Soultaker op 24-05-2009 17:51 ]


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
$TOKEN is gewoon een woord.

Ik wil bepaalde termen in een latex document italic maken, waarbij ik dit wil doen met een sed expressie.
Dit door $TOkEN in \textit{$TOKEN} om te zetten dus.
\textit{\textit{$TOKEN}} wordt een puinzooi, ik blijf dat document editten en on the fly die sed expressie draaien.
Wat wel kan is s/$TOKEN/\\textit{$TOKEN}/g en daarna \textit{\texit{$TOKEN}} vervangen door \textit{$TOKEN}

Maar dat is vrij goor.


Jouw aanpak heeft trouwens op zich wel zin, door die OR constructie. Bedankt voor de tip, alhoewel het eigenlijk niet mijn voorgenomen oplossingsrichting is.

[ Voor 15% gewijzigd door Boudewijn op 24-05-2009 21:28 ]

i3 + moederbord + geheugen kopen?