bash: Wörter in Dateien ersetzen
bash: Wörter in Dateien ersetzen
Hallo!
In einem bestimmten Verzeichnis sind viele Textdateien enthalten. Diese Textdateien enthalten alle den gleichen Tippfehler ("selbstenpackend" statt "selbstentpackend"). Allerdings ist der Fehler nicht immer an der gleichen Stelle: Mal ist er in 3. Zeile, mal in der 7.Zeile, ........
Nun möchte ich mir ein kleines Skript (bash) schreiben, dass diesen Fehler behebt.
Gibt es einen Befehl, mit denen man Wörtern in Dateien suchen und ändern/ersetzen kann?
Vielen Dank!
Gruß,
Thilo
In einem bestimmten Verzeichnis sind viele Textdateien enthalten. Diese Textdateien enthalten alle den gleichen Tippfehler ("selbstenpackend" statt "selbstentpackend"). Allerdings ist der Fehler nicht immer an der gleichen Stelle: Mal ist er in 3. Zeile, mal in der 7.Zeile, ........
Nun möchte ich mir ein kleines Skript (bash) schreiben, dass diesen Fehler behebt.
Gibt es einen Befehl, mit denen man Wörtern in Dateien suchen und ändern/ersetzen kann?
Vielen Dank!
Gruß,
Thilo
Code: Alles auswählen
for name in *.txt
do
cat $name | sed -e 's/88/xx/' > $name.new
mv $name.new $name
done
Oder so:
Dieses Script unter dem Namen korrektur-script in den Ordner mit den zu korrigierenden txt-Files legen Eine weitere Datei mit dem Namen wortliste in den Ordner legen
und im Ordner ausführen.
Blaubär
Dieses Script unter dem Namen korrektur-script in den Ordner mit den zu korrigierenden txt-Files legen
Code: Alles auswählen
#! /bin/bash
# korrektur-script
# Benutzung: .korrektur-script *.txt
# wendet ./wortliste auf die übergebenen Files an
for i in $*
do
echo "korrigiere $i"
# Backup der alten Datei erstellen
cp $i $i.bak
# Neue Datei erstellen
sed -f ./wortliste < $i.bak > $i
done
Code: Alles auswählen
s.selbstenpackend.selbstentpackend.g
s.altes_wort.neues_wort.g
Code: Alles auswählen
. korrektur-script *.txt
Blaubär
Zuletzt geändert von blaubaer am 23.05.2003 07:45:03, insgesamt 1-mal geändert.
Hallo!
Erstmal vielen Dank für Eure Antworten.
Nun noch eine kurze Frage:
Wie bereits geschrieben, enthalten alle Textdateien in dem Verzeichnis den gleichen Tippfehler ("selbstenpackend" statt "selbstentpackend").
Nun möchte ich gerne die ganze Zeile ersetzen, die das falsche Wort enthält. Allerdings kann es vorkommen, dass sich die Inhalte der Dateien unterscheiden. Ich kann also nicht nach einem langen String suchen.........
Ist das mit "sed" möglich?
Vielen Dank für Eure Mühe!
Gruß,
Thilo
Erstmal vielen Dank für Eure Antworten.
Nun noch eine kurze Frage:
Wie bereits geschrieben, enthalten alle Textdateien in dem Verzeichnis den gleichen Tippfehler ("selbstenpackend" statt "selbstentpackend").
Nun möchte ich gerne die ganze Zeile ersetzen, die das falsche Wort enthält. Allerdings kann es vorkommen, dass sich die Inhalte der Dateien unterscheiden. Ich kann also nicht nach einem langen String suchen.........
Ist das mit "sed" möglich?
Vielen Dank für Eure Mühe!
Gruß,
Thilo
Mit sed ist alles möglich
Mach mal ein Beispiel, von einer Datei (vorher / nachher)
BTW: Ich denke dass die obigen sed Scripte schon das tun, was du willst.
Sed ist ein "Streaming Editor". Der schert sich im Normalfall nicht um Zeilen.
Heisst:
--snip testfile--
Dies ist ein Testsatz
Dies ist mein Testatz
--end snip--
durch ein
ergibt
Dies ist kein Testatz
Dies ist mkein Testatz
Ok. der 2. macht nicht viel sind, aber erklärt die Funktionalität von sed
Mach mal ein Beispiel, von einer Datei (vorher / nachher)
BTW: Ich denke dass die obigen sed Scripte schon das tun, was du willst.
Sed ist ein "Streaming Editor". Der schert sich im Normalfall nicht um Zeilen.
Heisst:
--snip testfile--
Dies ist ein Testsatz
Dies ist mein Testatz
--end snip--
durch ein
Code: Alles auswählen
cat testfile | sed -e 's/ein/kein/'
Dies ist kein Testatz
Dies ist mkein Testatz
Ok. der 2. macht nicht viel sind, aber erklärt die Funktionalität von sed
Hallo!
Vielen Dank für Eure Hinweise.
@zyta2k: Folgendes Beispiel:
In einer Datei in dem Verzeichnis lautet die entsprechende Zeile wie folgt:
Wie man sehen kann, unterscheiden sich alle Zeilen - aber das Wort "selbstenpackend" ist stets vorhanden.
Wie kann ich nun erreichen, dass die Zeile mit dem falschen Wort z.B. durch die Zeile
Vielen Dank für Eure Mühe!
Gruß,
Thilo
Vielen Dank für Eure Hinweise.
@zyta2k: Folgendes Beispiel:
In einer Datei in dem Verzeichnis lautet die entsprechende Zeile wie folgt:
- Die insg. 17 Dateien auf der DVD sind selbstenpackend und fröhlich.
- Alle Inhalte auf dieser CD sind selbstenpackend, munter und klug.
- Die Datei ist selbstenpackend, pünktlich, frech, sauber und reich.
Wie man sehen kann, unterscheiden sich alle Zeilen - aber das Wort "selbstenpackend" ist stets vorhanden.
Wie kann ich nun erreichen, dass die Zeile mit dem falschen Wort z.B. durch die Zeile
- Dies ist eine selbstentpackende CD bzw. DVD.
Vielen Dank für Eure Mühe!
Gruß,
Thilo
Code: Alles auswählen
for name in *.txt
do
cat $name | sed -e 's/^.*selbstenpackend.*$/Dies ist eine selbstentpackende CD bzw\. DVD\./' > $name.new
done
kurze erklärung
s/alt/neu replace wort alt durch neu
. steht für irgendein zeichen
* steht für beliebig viele mal das vorhergende zeichen
^ steht für zeilenbeginn
$ steht für zeilenende
mit sed kannst du alles machen
beachte:
Um mit einem . zu ersetzen muss diesem ein \ davor gestellt werden, da der . ein sonderzeichen in sed ist (gilt auch für die anderen zeichen, wie *, $, ^, oder /)
S'gibt mit google haufenweise SED Beispiele
Hallo zyta2k!
Vielen Dank für Deine Hilfe!
Vielleicht noch eine klitzekleine Abschlußfrage:
Angenommen, ich definiere zwei Variablen:
Dies wollte ich gerne in Dein kleines Skript einbauen:
Leider klappt das so nicht...........
Kannst Du mir helfen?
Gruß und vielen Dank für Deine Mühe!
Thilo
Vielen Dank für Deine Hilfe!
Vielleicht noch eine klitzekleine Abschlußfrage:
Angenommen, ich definiere zwei Variablen:
Code: Alles auswählen
SUCHEN='selbstenpackend'
ERSETZEN='Dies ist ein selbstentpackender Datentraeger'
Code: Alles auswählen
for name in *.txt
do
cat $name | sed -e 's/^.*$SUCHEN.*$/$ERSETZEN/' > $name.new
done
Kannst Du mir helfen?
Gruß und vielen Dank für Deine Mühe!
Thilo
Versuch doch mal die Variablen zu klammern, d.h.
sed erlaubt es auch, Teile des Suchausdrucks in dem zu ersetzenden Muster wiederzuverwenden. Dazu sind diese Abschnitte speziell durch \( bzw. \) zu kennzeichnen, anschließend können sie mit \1, \2, usw. wiederverwendet werden. Beispiel:
Damit solltest Du Dein Problem, verschiedene Sätze bearbeiten zu wollen, lösen können.
Viel Erfolg,
keyem
Code: Alles auswählen
$(SUCHEN)
Code: Alles auswählen
s/\(.*\)selbstenpackend\(.*\)$/\1selbstentpackend\2/g
Viel Erfolg,
keyem