Perl in der Shell: 2x Suchen und 1x Ersetzen

W

wuffi

Grünschnabel
Hallo,

also es geht um folgendes Problem (bin da auch noch ganz neu):

Ich möchte per Shell ungefähr folgendes Kommando ausführen:

perl -pi -e 's/Z%e%i%l%e%/S)a)t)z)t)e)i)l)/E.r.s.a.t.z/g' DATEI

Das funktioniert so aber nicht.
Ich möchte eine oder mehrere Zeilen suchen die das Wort "Z%e%i%l%e%" beinhalten, in diesen rausgesuchten Zeilen möchte ich das Wort "S)a)t)z)t)e)i)l)" finden und mit dem Wort "E.r.s.a.t.z." ersetzen.

Wie macht man dies am besten?

mfg

edit: Bei den Wörtern im obrigen Script sollen Sonderzeichen ignoriert werden, das macht dann doch dann mit \ oder?

Bsp: Z\%e\%i\%l\%e\%
 
Zuletzt bearbeitet:
Wie wäre es denn statt Perl mit sed?

Folgendes funktioniert mit GNU sed:
Code:
# Nur erstes Vorkommen in jeder (passenden) Zeile ersetzen:
sed -i '/Z%e%i%l%e%/ s/S)a)t)z)t)e)i)l)/E.r.s.a.t.z./' DATEI
# Alle Vorkommen in jeder passenden Zeile ersetzen:
sed -i '/Z%e%i%l%e%/ s/S)a)t)z)t)e)i)l)/E.r.s.a.t.z./g' DATEI

Das POSIX-sed kennt die Option "-i" nicht; du müsstest dann erst einmal in eine andere Datei schreiben und dann die originale Datei durch die bearbeitete ersetzen (diese Option verändert die Datei direkt).

Nutzt du eine Linux-Distribution, verwendest du höchstwahrscheinlich GNU sed. :)

Bei den Wörtern im obrigen Script sollen Sonderzeichen ignoriert werden, das macht dann doch dann mit \ oder?
Prinzipiell ja, jedoch enthalten deine Muster keine speziellen Zeichen; höchstens die Klammern könnten als besonders gelten -- jedoch nutzt sed standardmäßig sog. Basic Regular Expressions oder BREs, und da werden unmaskierte Klammern nicht besonders behandelt. Das ist bei Extended Regular Expressions/EREs und bei den von Perl unterstützten regulären Ausdrücken allerdings genau andersherum! Kurz gesagt: Bei Perl müsstest du die Klammern maskieren (also ein \ vorstellen), bei sed standardmäßig nicht.
 
Hallo,

danke für die Antwort!

Ich weiß, dass das Ganze auch mit sed geht, aber ich will es ja mit perl versuchen ;-).

mfg

edit:

ok hab jetz doch alles mit sed gemacht :)
 
Zuletzt bearbeitet:

Ähnliche Themen

Charakter ersetzen in spez. Bereich mittels sed

Mehrzeiligen String mittels sed ersetzen

sed: -e Ausdruck #1, Zeichen 6: unknown option to `s'

Prozess aus eigenem Init script wird gekillt

iptables - default policy - Server macht dicht

Zurück
Oben