• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] Textersetzung in Dateien

mampfi

Hacker
Suche nach einem Weg, wie ich in einer Reihe von Dateien Text ersetzen kann.

beispielsweise in allen *.txt Dateien 'a' durch 'b'.

Mit dem sed kriege ichs einfach nur mit einer Datei hin.
 

nobbiew

Hacker
Code:
for x in `find . -name '*.txt'`
do
	sed 's/a/b/g' $x >$x.new
	cat $x.new >$x
	rm -f $x.new
done
sollte genau das machen was du willst.
Das Problem liegt daran, dass sed nur auf die Standardausgabe ausgibt und eine Umleitung in die Ursprungsdatei nicht funktioniert, da diese zu dem Zeitpunkt exclusiv von sed geöffnet ist. Mit der cat- u. rm-aktion werden die Schutzrechte der Ursprungsdatei beibehalten.
In diesem fall ersetzt sed alle vorkommen von a in einer zeile, wenn du g wecklässt ersetzt er nur das jeweils erste Vorkommen in der Zeile
 
OP
M

mampfi

Hacker
Danke Dir, also doch mit Schleife.

Bei den UNIX-Tools kann man leicht den Überblick verlieren ;-)
 

mattias

Newbie
nobbiew schrieb:
Das Problem liegt daran, dass sed nur auf die Standardausgabe ausgibt und eine Umleitung in die Ursprungsdatei nicht funktioniert, da diese zu dem Zeitpunkt exclusiv von sed geöffnet ist.

Mit der Konstruktion
Code:
	for x in `find . -name '*.txt'`
do
	cat $x | sed 's/a/b/g' >$x
done
läßt sich das Problem mit der im Zugriff befindlichen Ursprungsdatei umgehen und das Erzeugen von temporären Dateien ist nicht mehr erforderlich.

CU Mattias P.
 

nobbiew

Hacker
Und wie groß ist der Puffern, damit das nicht in die Hose geht. cat liest meines wissens nicht alles in den Arbeitsspeicher, bevor es mit der Ausgabe beginnt. Und dann hast du ein Problem. Da ja die Ursprungsdatei schon mit der Ausgabe von sed überschriebe wurde
 
Oben