Hallo,
ich habe ein Problem mit der Dateibearbeitung per sed.
Ich möchte in einem Verzeichnis mit Unterverzeichnissen alle Dateien heraussfinden, die "SUCHWORT" enthalten.
Diese sollen dann mittels sed bearbeitet werden in der Form, dass "SUCHWORT" gegen "ERSETZUNG" ausgetauscht wird.
Um die Dateien zu finden nehme ich mir grep zu Hilfe:
<blockquote><hr>grep -r -l "SUCHWORT" dir/* 2> /dev/null<hr></blockquote>
Der grep Befehl liefert die Dateinamen mit realivem Unterverzeichnis, falls die Datei in einem SubDir lag.
sed soll nun den Austausch vornehmen:
<blockquote><hr>sed -e 's/SUCHWORT/ERSETZUNG/g' DATEI > DATEI<hr></blockquote>
Setzte ich an Stelle des ">" ein ">>" ein, fügt sed die Bearbeiteten Textzeilen korrekt an das Ende der Datei.
Gebe ich einen anderen Dateinamen als Ziel an, wird diese Datei richtig erzeugt mit korrektem Inhalt.
Das ganze habe ich in einem Script versucht zu automatisieren:
<blockquote><hr>#!/bin/sh
for i in `grep -r -l "SUCHWORT" dir/* 2> /dev/null`; do
test -r $i || continue
sed -e 's/SUCHWORT/ERSETZUNG/g' $i > $i
done<hr></blockquote>
nur leider sind alle Dateien, die SUCHWORT enthalten, nach Ausführung des Sriptes leer.
Hat jemand eine Idee, oder evt. auch einen anderen Lösungsvorschlag für mein Problem?
Vielen Dank
Thorsten
PS: Angemeldet am System als root, habe also auch die nötigen Rechte...
autom. Dateibearbeitung mit SED
autom. Dateibearbeitung mit SED
Last edited by thorsten on 22. Jan 2003 12:03, edited 1 time in total.
Re: autom. Dateibearbeitung mit SED
Hi!
Durch das Umleiten des sed-Befehls wird die Zieldatei erstellt bevor die Quelldatei eingelesen wird. Da es sich hierbei allerdings um ein und dieselbe Datei handelt wird die Datei vorher gelöscht da du > und nicht >> verwendet hast. Versuch mal den folgenden Code. Der erstellt zuerst eine Sicherheitskopie und nutzt diese dann als Quelldatei für das sed-Kommando.
Gruß
Chris
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/sh
for i in `grep -r -l "SUCHWORT" dir/* 2> /dev/null`; do
test -r $i || continue
cp $i $i.bak
sed -e 's/SUCHWORT/ERSETZUNG/g' $i.bak > $i
done
</font><hr></pre></blockquote>
Durch das Umleiten des sed-Befehls wird die Zieldatei erstellt bevor die Quelldatei eingelesen wird. Da es sich hierbei allerdings um ein und dieselbe Datei handelt wird die Datei vorher gelöscht da du > und nicht >> verwendet hast. Versuch mal den folgenden Code. Der erstellt zuerst eine Sicherheitskopie und nutzt diese dann als Quelldatei für das sed-Kommando.
Gruß
Chris
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/sh
for i in `grep -r -l "SUCHWORT" dir/* 2> /dev/null`; do
test -r $i || continue
cp $i $i.bak
sed -e 's/SUCHWORT/ERSETZUNG/g' $i.bak > $i
done
</font><hr></pre></blockquote>
Re: autom. Dateibearbeitung mit SED
Vielen Dank, das hat mit einer weiteren Änderung dann funktioniert.
Habe noch eine Zeile eingefügt das die -bak wieder gelöscht wird.
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/sh
for i in `grep -r -l "ueber18" dir/* 2> /dev/null`; do
test -r $i || continue
cp $i $i.bak
sed -e 's/ueber18/eroproof/g' $i.bak > $i
rm $i.bak
done
</font><hr></pre></blockquote>
Habe noch eine Zeile eingefügt das die -bak wieder gelöscht wird.
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/sh
for i in `grep -r -l "ueber18" dir/* 2> /dev/null`; do
test -r $i || continue
cp $i $i.bak
sed -e 's/ueber18/eroproof/g' $i.bak > $i
rm $i.bak
done
</font><hr></pre></blockquote>