sed-Verständnisfrage

18/10/2007 - 13:14 von Heinz Müller | Report spam
Hallo Zusammen,

ich beschàftige mich in den letzten Tagen mit sed. Nachdem ich nun mit den
Basics vetraut bin
stellt man sich höheren Aufgaben. Auf
http://sed.sourceforge.net/sed1line_de.html steht die folgende Zeile:

sed '1!G;h;$!d'

Dies stellt die Reihenfolge innerhalb einer Datei um. Aus

1
2
3

wird

3
2
1

Mir ist jedoch nicht ganz klar warum! Die einzelnen Parameter kenne ich (
wobei die "1"
mir etwas Probleme bereitet ), aber das Puzzle kann ich nicht
zusammensetzen, z.B. was
bedeutet das ! vor dem G ( "!" ist mir als Negation bekannt ).

Kann mir das jemand kurz erklàren?

Danke!

Gruß
Heinz
 

Lesen sie die antworten

#1 Paul Hink
18/10/2007 - 13:37 | Warnen spam
Heinz Müller wrote:

ich beschàftige mich in den letzten Tagen mit sed. Nachdem ich nun
mit den Basics vetraut bin stellt man sich höheren Aufgaben. Auf
http://sed.sourceforge.net/sed1line_de.html steht die folgende Zeile:

sed '1!G;h;$!d'

Dies stellt die Reihenfolge innerhalb einer Datei um.

[...]

Mir ist jedoch nicht ganz klar warum! Die einzelnen Parameter kenne
ich ( wobei die "1" mir etwas Probleme bereitet ),



| Addresses
|
| Sed commands can be given [...] with one address, in which
| case the command will only be executed for input lines which
| match that address [...]

| [...]

| The following address types are supported:
|
| number Match only the specified line number.

| [...]

Quelle: sed-Manpage

aber das Puzzle kann ich nicht zusammensetzen, z.B. was bedeutet das
! vor dem G ( "!" ist mir als Negation bekannt ).



| After the address (or address-range), and before the command,
| ! a may be inserted, which specifies that the command shall
| only be executed if the address (or address-range) does not
| match.

Quelle: sed-Manpage

Kann mir das jemand kurz erklàren?



Es passiert folgendes:

- für die erste Zeile:
- '1!G': matcht nicht, d.h. das Kommando 'G' wird ignoriert.
- 'h': "Copy pattern space to hold space.", d.h. die Zeile
wird im "hold space" abgelegt.
- '$!d': matcht, sofern der Input aus mehr als einer Zeile
besteht, d.h. 'd' wird ausgeführt: "Delete pattern
space. Start next cycle.", d.h. die Zeile im "pattern
space" wird nicht ausgegeben.

- für alle folgenden Zeilen:
- '1!G': matcht, d.h. 'G' wird ausgeführt: "Append hold space to
pattern space.", d.h. die vorherige(n) Zeile(n), die
(in umgekehrter Reihenfolge) im "hold space"
zwischengespeichert ist/sind, werden an die aktuelle
Zeile im "pattern space" angehàngt.
- 'h': "Copy pattern space to hold space.", d.h. die im
"pattern space" in umgekehrter Reihenfolge abgelegten
Zeilen werden im "hold space" zwischengespeichert.
- '$!d': matcht, sofern es sich nicht um die letzte Zeile
handelt, d.h. 'd' wird ausgeführt (s.o.).

- für die letzte Zeile zusàtzlich:
- '$!d': matcht nicht, d.h. 'd' wird nicht ausgeführt. Dann
greift das Standardverhalten von sed am Ende des
Scripts: Die noch im "pattern space" befindliche(n)
Zeile(n) werden ausgegeben.

Ähnliche fragen