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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.