Suchstring in textdateien ersetzen

Post Reply
Message
Author
eq

Suchstring in textdateien ersetzen

#1 Post by eq »

hi ...

ich habe ca. 35 verschiedene Textdateien.

in allen steht irgendwie der string "$action" ... nun möchte ich diesen string (da er nicht benutzt werden darf) durch "$useraktion" ersetzen.

im vi kenne ich

1,$s/$action/$useraktion/g

wie sähe das in ner (z.Bsp.) while-schleife aus ? .. mit sed ?

danke für Hilfe

Jochen

Re: Suchstring in textdateien ersetzen

#2 Post by Jochen »

Die m.E. einfachste Lösung ist ein Mini-Perlskript:<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">perl -p -i.bak -e 's/\<!--no-->$action/$useraktion/g' datei1 datei2 ...</font><hr></pre></blockquote>perl arbeitet in-place, legt aber vor dem Suchen und Ersetzen in der Datei eine Sicherungskopie mit Endung .bak an (-i.bak). Die Liste der benötigten Dateien lässt sich leicht mittels find und xargs zusammenstellen:<pre>find . -name "*.sh" -print0 | xargs -0 perl ...</pre>Damit würdest Du ab dem Arbeitsverzeichnis alle Dateien, die auf .sh enden, bearbeiten.

Jochen

eq

Re: Suchstring in textdateien ersetzen

#3 Post by eq »

hi .. .
ich habe alles versucht, aber es tut sich mit diesem befehl nichts ....
er scheint zwar zu arbeiten eine Zeit lang, aber er ändert nichts
ich glaube, mein Problem liegt an der Zusammenstellung mit find

eq

Jochen

Re: Suchstring in textdateien ersetzen

#4 Post by Jochen »

OK, ich habe es selbst noch mal versucht; das Problem liegt wohl darin, dass perl eine Zeichenkette, die mit "$" beginnt, auch in Regulären Ausdrücken als skalare Variable aussieht. Folgendes Kommando funktioniert einwandfrei (gerade selbst getestet):<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">find . -name "*.pl" -print0 | xargs -0 perl -p -i.bak -e 's/\<!--no-->$action/\<!--no-->$useraktion/g'</font><hr></pre></blockquote>Nochmal aufgedröselt:
<li> find sucht ab dem aktuellen Arbeitsverzeichnis (.) alle Dateien, deren Name auf .pl endet (-name "*.pl").
<li> Diese gibt er mittels NUL-Byte terminiert aus, damit Lehrzeichen im Namen nicht stören können (-print0).
<li> xargs nimmt diese Liste von Dateinamen entgegen; "-0" sagt ihm, das die Einträge NUL-terminiert sind.
<li> Aus den Dateinamen baut xargs eine Parameterliste für das perl-Kommando.
<li> perl wird ein Suchen & Ersetzen (-e '...') innerhalb der angegebenen Dateien (-i) machen, zur Sicherheit aber vorher Kopien der Ursprungsdateien mit der Endung anlegen.
<li> Die Option "-p" bewirkt, dass perl jede Zeile jeder Datei einliest, das Substitute-Kommando darauf ausführt und jede Zeile dann wieder ausgibt.

So, <i>jetzt</i> muss es aber funktionieren! <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Jochen

Post Reply