Regex für sed ersetzt zu viel

Gast #2016318
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
#2016381
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
Gast #2016410
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
Moderator #2016586
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren