www.mikrocontroller.net

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


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Regex-Experten,

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

Nun möchte ich den Pfad für das Unterverzeichnis "grafiken" anpassen, 
dass das ganze so aussieht:
\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:
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"
\includegraphics{grafiken/opologie.pstex}%

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

Vielen Dank,

Peter

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Antwort, das löst das Problem auf eine noch einfachere 
Weise:
\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

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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:
sed -i 's!\(\\includegraphics{\)\(grafiken/\)\?!\1grafiken/!' file.pstex_t

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.