bash: Wörter in Dateien ersetzen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
thilo
Beiträge: 241
Registriert: 12.12.2002 22:48:44

bash: Wörter in Dateien ersetzen

Beitrag von thilo » 22.05.2003 13:37:09

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

Benutzeravatar
zyta2k
Beiträge: 2446
Registriert: 14.03.2003 09:18:00
Kontaktdaten:

Beitrag von zyta2k » 22.05.2003 16:19:48

Code: Alles auswählen

for name in *.txt
 do
   cat $name | sed -e 's/88/xx/' > $name.new
   mv $name.new $name
done
Ersetzt im aktuellen Verzeichnis in allen *.txt Files die 88 durch xx

Benutzeravatar
blaubaer
Beiträge: 417
Registriert: 20.02.2003 13:57:01
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von blaubaer » 22.05.2003 16:45:00

Oder so:
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
Eine weitere Datei mit dem Namen wortliste in den Ordner legen

Code: Alles auswählen

s.selbstenpackend.selbstentpackend.g
s.altes_wort.neues_wort.g
und im Ordner

Code: Alles auswählen

. korrektur-script *.txt
ausführen.

Blaubär
Zuletzt geändert von blaubaer am 23.05.2003 07:45:03, insgesamt 1-mal geändert.

thilo
Beiträge: 241
Registriert: 12.12.2002 22:48:44

Beitrag von thilo » 22.05.2003 21:35:08

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

Benutzeravatar
zyta2k
Beiträge: 2446
Registriert: 14.03.2003 09:18:00
Kontaktdaten:

Beitrag von zyta2k » 22.05.2003 22:47:37

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

Code: Alles auswählen

cat testfile | sed -e 's/ein/kein/'
ergibt
Dies ist kein Testatz
Dies ist mkein Testatz

Ok. der 2. macht nicht viel sind, aber erklärt die Funktionalität von sed ;)

thilo
Beiträge: 241
Registriert: 12.12.2002 22:48:44

Beitrag von thilo » 23.05.2003 08:23:22

Hallo!

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.
In einer anderen Datei lautet die Zeile mit dem Tippfehler wie folgt:
  • Alle Inhalte auf dieser CD sind selbstenpackend, munter und klug.
In einer weiteren Datei lautet die Zeile mit dem falschen Wort so:
  • Die Datei ist selbstenpackend, pünktlich, frech, sauber und reich.
Ist natürlich nur ein Beispiel.

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.
ersetzt wird?


Vielen Dank für Eure Mühe!


Gruß,

Thilo

Benutzeravatar
zyta2k
Beiträge: 2446
Registriert: 14.03.2003 09:18:00
Kontaktdaten:

Beitrag von zyta2k » 23.05.2003 09:11:09

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
sed arbeitet mit regexp

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

thilo
Beiträge: 241
Registriert: 12.12.2002 22:48:44

Beitrag von thilo » 23.05.2003 10:09:13

Hallo zyta2k!

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'
Dies wollte ich gerne in Dein kleines Skript einbauen:

Code: Alles auswählen

for name in *.txt 
do 
     cat $name | sed -e 's/^.*$SUCHEN.*$/$ERSETZEN/' > $name.new 
done
Leider klappt das so nicht...........

Kannst Du mir helfen?


Gruß und vielen Dank für Deine Mühe!


Thilo

keyem
Beiträge: 303
Registriert: 23.08.2002 07:50:28
Wohnort: Berlin

Beitrag von keyem » 23.05.2003 10:24:27

Versuch doch mal die Variablen zu klammern, d.h.

Code: Alles auswählen

$(SUCHEN)
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:

Code: Alles auswählen

s/\(.*\)selbstenpackend\(.*\)$/\1selbstentpackend\2/g
Damit solltest Du Dein Problem, verschiedene Sätze bearbeiten zu wollen, lösen können.

Viel Erfolg,
keyem

Antworten