Forum: PC-Programmierung Regex für sed ersetzt zu viel


von Peter (Gast)


Lesenswert?

Hallo Regex-Experten,

ich möchte per Bash-Skript mit sed einen Pfad korrigieren. Die 
ursprüngliche Zeile sieht folgendermaßen aus:
1
\includegraphics{topologie.pstex}%

Nun möchte ich den Pfad für das Unterverzeichnis "grafiken" anpassen, 
dass das ganze so aussieht:
1
\includegraphics{grafiken/topologie.pstex}%

Dabei soll das Skript kein weiteres "grafiken/" mehr einfügen, wenn der 
Pfad bereits richtig ist. Mein sed-Befehl ist der folgende:
1
sed -i 's!'includegraphics{[^\(grafiken/\)]'!'includegraphics{grafiken/'!' file.pstex_t

(also jedes Vorkommen von "includegraphics{" ohne nachfolgendes 
"grafiken/" durch "includegraphics{grafiken/" ersetzen)

Das funktioniert soweit auch, allerdings verschluckt es den ersten 
nachfolgenden Buchstaben in der Ausgabe, hier also das "t"
1
\includegraphics{grafiken/opologie.pstex}%

Vielleicht kann mir jemand kurz weiterhelfen, wo mein Denkfehler liegt.

Vielen Dank,

Peter

von Vlad T. (vlad_tepesch)


Lesenswert?

es gibt ein Package mit dem kann man Suchpfade für grafiken festlegen um 
genau solche ersetzorgien zu vermeiden.

ich bin perl-regexes gewohnt, aber mir kommen die Eckigen Klammern 
komisch vor, die kennzeichnen ja eigntlich Zeichenklassen.

die hochkomma zwischen den Regeex-Trennzeichen find ich auch komisch


ganz einfache methode:

texteditor
suchen:   \includegraphics{
ersetzen: \includegraphics{grafiken/

und danach solange
suchen: grafiken/grafiken/
ersetzen: grafiken/
bis nix mehr ersetzt wird


edit:
\graphicspath heißt das Zauberwort

das ist auch insofern cleverer, da man damit einfach einen 
Low-Resolution-Ordner angeben kann, um PDF nur zur Anzeige (oder 
Entwurf) zu erzeugen

von Peter (Gast)


Lesenswert?

Danke für deine Antwort, das löst das Problem auf eine noch einfachere 
Weise:
1
\graphicspath{{grafiken/}}

(auch wenn der Lernprozess im Bezug auf sed damit wohl erstmal wieder 
beendet ist ;-) )

Suchen und ersetzen kommt in diesem Fall nicht in Frage, weil ich die 
Bilder mit xfig erzeuge, und in zwei separate Dateien (Grafik und 
Beschriftung) exportiere. Von diesen bindet nun die eine die andere ein, 
und ich müßte nach jeder Änderung manuell die entsprechende Datei 
editieren.

Die Hochkomma bei den Regex sind wohl optional, das mit den eckigen 
Klammern habe ich aus einer Kurzreferenz entnommen.

Peter

von Yalu X. (yalu) (Moderator)


Lesenswert?

In einem []-Ausdruck haben \( und \) keine gruppierende Wirkung, weil
der Ausdruck sowieso nur ein einzelnes Zeichen matcht. Da die Klammern
deswegen auch nicht escapet werden müssen, sind die \ vor den Klammern
ganz gewöhnliche Zeichen.

[^\(grafiken/\)] matcht folglich jedes Zeichen, das von \, (, g, r usw.
verschieden ist. Da auch das t darunter fällt, wird in dieser Zeile

  \includegraphics{topologie.pstex}%

das t gematcht und somit der String "includegraphics{t" ersetzt. Da sed
m.W. keine Negation von Teilausdrücken unterstützt, muss man das anders
machen, etwa so:
1
sed -i 's!\(\\includegraphics{\)\(grafiken/\)\?!\1grafiken/!' file.pstex_t

von Peter (Gast)


Lesenswert?

Ok, dann ist mir auch das klar. Danke für die ausführliche Schilderung, 
ich bin sicher, dass ich es nochmal brauchen werde.

Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.