Textblöcke mit AWK oder SED ersetzen.

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
fiberkill
Beiträge: 221
Registriert: 28.03.2007 09:08:30

Textblöcke mit AWK oder SED ersetzen.

Beitrag von fiberkill » 19.04.2010 15:38:31

Hallo,
ich habe eine lange Textdatei.
In dieser Datei möchte ich einen Textblock, der einen definierten Anfang und Ende hat.
Diesen Bock möchte ich mit einem anderen Textblock, der die gleichen Anfang- und Ende-Strings hat ersetzen.
Da ich mit AWK bzw SED nicht viel erfahrung habe, wäre ich für Hilfestellung sehr dankbar
Wie könnte das aussehen.

Gruß fk

Benutzeravatar
Meillo
Moderator
Beiträge: 9253
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Textblöcke mit AWK oder SED ersetzen.

Beitrag von Meillo » 19.04.2010 22:35:10

fiberkill hat geschrieben: In dieser Datei möchte ich einen Textblock, der einen definierten Anfang und Ende hat.
Sind die Anfangs- und End-Marker eindeutig in der Datei? Also, gibt's die nur genau einmal?
Diesen Bock möchte ich mit einem anderen Textblock, der die gleichen Anfang- und Ende-Strings hat ersetzen.
Nimm ed. Hier eine Beispielsession:

Code: Alles auswählen

$ cat a
/dev/wd0a on / type ffs (local)
kernfs on /kern type kernfs (local)
serveme:/multimedia on /multimedia type nfs
serveme:/data on /data type nfs
serveme:/scratch on /scratch type nfs

$ ed -s a <<EOF
> /kernfs/,/data/c
> foo
> bar
> .
> w
> q
> EOF

$ cat a
/dev/wd0a on / type ffs (local)
foo
bar
serveme:/scratch on /scratch type nfs

$ 
Use ed once in a while!

fiberkill
Beiträge: 221
Registriert: 28.03.2007 09:08:30

Re: Textblöcke mit AWK oder SED ersetzen.

Beitrag von fiberkill » 20.04.2010 07:20:27

@Meillo
Erst einmal Danke. Könntest Du mir diese ed-Session etwas genauer erklären ??

Danke im Voraus.

Gruß fk

Benutzeravatar
Meillo
Moderator
Beiträge: 9253
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Textblöcke mit AWK oder SED ersetzen.

Beitrag von Meillo » 20.04.2010 11:36:12

fiberkill hat geschrieben:@Meillo
Erst einmal Danke. Könntest Du mir diese ed-Session etwas genauer erklären ??
Klar.

Sind die cat-Kommandos (das erste und das letzte) klar? Damit gebe ich nur eine Testdatei aus -- davor und danach.

Ed wird aufgerufen mit

Code: Alles auswählen

ed -s a <<EOF
`-s' bedeutet, dass ed keine Statusausgaben macht. Das will man immer dann wenn man ed automatisiert verwendet.
`a' ist die Datei die editiert werden soll.
<<EOF startet ein Here-Dokument; dieses umfasst alle folgende Eingabe bis zum nächsten EOF.
Mit Here-Docs kann man Text in die Standardeingabe schreiben. Damit kann ed automatisiert werden.

Die ed-Befehle:

Code: Alles auswählen

/kernfs/,/data/c
bedeutet: ersetze (change) den Bereich der Datei, der mit der Zeile anfängt auf den die RegExp /kernfs/ passt, bis zu der Zeile auf den die RegExp /data/ passt. Da musst du deine Marker eintragen.
Der Ersatztext folgt dem c-Kommando und wird mit dem nächsten alleinstehenden Punkt abgeschlossen. Da muss dein Ersatztext stehen.
Danach wird gesichert (write).
Dann beendet (quit).

Ed ist nicht allzu umfangreich. Schau dir seine Manpage an und spiele ein bisschen interaktiv an einer kleinen Datei rum, dann kommst du schnell dahinter wie du ihn bedienen musst. (Interaktiv heißt, dass du das Here-Doc weglässt und statt dessen die Befehle interaktiv eingibst.) Du kannst dir dazu auch den ersten Teil meines Softwareschätze-Vortrags anschauen, da erkläre ich ed Stück für Stück. http://ulm.ccc.de/ChaosSeminar/2009/10_Softwareschaetze
Use ed once in a while!

chrisbra
Beiträge: 122
Registriert: 19.10.2005 09:36:09
Wohnort: Sachsen-Anhalt
Kontaktdaten:

Re: Textblöcke mit AWK oder SED ersetzen.

Beitrag von chrisbra » 29.04.2010 15:10:34

Meillo hat geschrieben:
fiberkill hat geschrieben: In dieser Datei möchte ich einen Textblock, der einen definierten Anfang und Ende hat.
Sind die Anfangs- und End-Marker eindeutig in der Datei? Also, gibt's die nur genau einmal?
Diesen Bock möchte ich mit einem anderen Textblock, der die gleichen Anfang- und Ende-Strings hat ersetzen.
Nimm ed. Hier eine Beispielsession:

Code: Alles auswählen

$ cat a
/dev/wd0a on / type ffs (local)
kernfs on /kern type kernfs (local)
serveme:/multimedia on /multimedia type nfs
serveme:/data on /data type nfs
serveme:/scratch on /scratch type nfs

$ ed -s a <<EOF
> /kernfs/,/data/c
> foo
> bar
> .
> w
> q
> EOF

$ cat a
/dev/wd0a on / type ffs (local)
foo
bar
serveme:/scratch on /scratch type nfs

$ 
Das ist aber etwas umständlich:

Code: Alles auswählen

chrisbra t41:/tmp/sed [1147:4]% sed '/kernfs/,/data/c\
foo\
blah' mount.txt
/dev/wd0a on / type ffs (local)
foo
blah
serveme:/scratch on /scratch type nfs
Meine Whishlist
:wq!

Antworten