[sed:] Ersetzen mit newline

maceis

maceis

Aktives Mitglied
Thread Starter
Dabei seit
24.09.2003
Beiträge
16.880
Reaktionspunkte
626
hallo zusammen,

ich habe eine Frage zu sed.

Das hier funktioniert:
Code:
#echo "jedes wort in einer zeile" | sed -e 'y/ /\n/'
jedes
wort
in
einer
zeile
Das nicht:
Code:
echo "jedes wort in einer zeile" | sed -e 's/ /\n/g'
jedesnwortninneinernzeile
Warum nicht?
Wie erreiche ich mit "s/ /\n/g" das selbe Ergebnis wie mit "y/ /\n/"?

Ich habe gelesen, dass mit manchen sed Versionen die /s Variante auch "funktioniert".
Unter Mac OS X und FreeBSD habe ich es aber nicht geschafft.

Danke im voraus.
 
Okay, gelöst.
So geht es:
Code:
% echo "Jedes einzelne Wort eine Zeile" | sed  's/ /\       
/g'
Jedes
einzelne
Wort
eine
Zeile

Aber leider geht das nicht, obwohl es laut manpage (s. "man sed | less +107") gehen müsste:
Code:
% echo "Alles                                                
in
einer
Zeile" | sed 's/\n/ /g'
Alles 
in
einer
Zeile

Vorschläge?
Lösungen?
 
Probiere es mal mit der Syntax:

echo "hallo" | sed -e 's,hallo,holla,'
 
Oh, sehe gerade, dass es evtl. daran liegt:

man sed:

2. The escape sequence \n matches a newline character embedded in the
pattern space. You can't, however, use a literal newline character
in an address or in the substitute command.
 
Das habe ich auch gelesen.
Eigentlich steht da doch, dass es klappen müsste.
Ich habe im pattern space die escape sequence angegeben \n und erwarte, dass es auf newline characters matched.
Ich probier gerade mit Puffern herum. Ich glaub damit bekommt man es hin.

Das -e ist übrigens redundant, wenn nur ein Kommando ausgeführt wird.
 
Mit \n kann man nicht ersetzen, aber mit "wörtlichen Zeilenumbrüchen" s.o.

In Deinem Link steht, wie man einzelne \n ersetzen kann.
Wenn man mehrere \n ersetzen möchte wird es komplizierter, geht aber auch, z.B. so:
Code:
echo "Alles
auf
einer
Zeile" |\
sed -n 'H;$blable
d;:lable
g;s/\n/ /g;p'
 
Okay, es ist wohl ein Bug in OSX?

Auf Gentoo z.B.:

echo "jedes wort in eine zeile" |sed -e 's/ / \n/g'
jedes
wort
in
eine
zeile

funktioniert es tadellos, doch nicht auf OSX.
 
sed am Mac ist eine Qual, wenn man vorher mit dem sed gearbeitet hat, das etwa bei Ubuntu dabei ist. gsed ist nicht viel besser; ich bin der Einfachkeit halber auf Perl umgestiegen. Da ist wenigstens alles "genormt" und Newlines kann man auch ohne Probleme matchen.

Derjenige, der herausfindet, wie man am Mac mit sed mehrere Newlines zu einer einzigen eliminiert bekommt... hm, sagen wir, der ist klug.
 
@uselessuser

installiere und compiliere gnu sed und dann verfahre wie unter linux :)
 
chen schrieb:
Okay, es ist wohl ein Bug in OSX?

Auf Gentoo z.B.:

echo "jedes wort in eine zeile" |sed -e 's/ / \n/g'
jedes
wort
in
eine
zeile

funktioniert es tadellos, doch nicht auf OSX.
Das ist kein Bug sondern, wie ich gelesen habe, ein undefiniertes Verhalten von GNU sed, die wohl nicht POSIX konform ist.
Ich nehme an, dass in Gentoo GNU sed installiert ist.
 
gsed hat aber auch wieder eine andere Syntax. Und bevor ich irgendwann gar nicht mehr weiß wo ich \ setzen soll und wo nicht, bleibe ich jetzt lieber bei Perl ;) So lange man nur selbst Programme schreibt und nicht die von anderen verstehen muss...
 
uselessuser schrieb:
...
Derjenige, der herausfindet, wie man am Mac mit sed mehrere Newlines zu einer einzigen eliminiert bekommt... hm, sagen wir, der ist klug.
Danke für das Kompliment :D (s. Beitrag 7).
 
sed auf OSX ist wirklich Schrott:

z.B. liefert gentoo:

sed --version
GNU sed version 4.1.4
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

Unter OSX gibt es --version gar nicht, ich weiß leider nicht welche Version installiert ist. Ist jedenfalls nicht die GNU SED version, sondern eine FreeBSD Variante, sehr spartanisch.
 
@maceis: Tut bei mir nicht. *g* Ohne dass ich genau verstünde was da vor sich gehen soll...
@chen: Also bei mir gibt sed ohne Probleme mit -V bzw. --version die Versionsnummer aus... 4.0.5
 
@uselessuser

Bei mir 2 Maschinen, Tiger 10.4.3 funktioniert weder -V noch --version.
 
chen schrieb:
sed auf OSX ist wirklich Schrott:
[...]
Ist jedenfalls nicht die GNU SED version, sondern eine FreeBSD Variante, sehr spartanisch.
Da kann ich Dir nicht zustimmen.

GNU sed >= 4.1 zeigt ein undefiniertes Verhalten, weil die GNUler wohl SUSv3 nicht gelesen haben und eine sed Variante ausliefern, die nicht UNIX konform ist ;).

[2addr]s/BRE/replacement/flags
...
The replacement string [...] The meaning of a '\' immediately followed by any character other than '&', '\', a digit, or the delimiter character used for this command, is unspecified.
...
Nachzulesen hier

Ach so, ich vergaß, GNU´s not Unix :D.
 
uselessuser schrieb:
@maceis: Tut bei mir nicht. *g* Ohne dass ich genau verstünde was da vor sich gehen soll...
@chen: Also bei mir gibt sed ohne Probleme mit -V bzw. --version die Versionsnummer aus... 4.0.5
was sagt "uname -a"?
Was wird bei Dir komplett mit "sed -V" ausgegeben?
Scheint jedenfalls nicht OS X zu sein.
 
Evtl. noch die Panther Version? Könnte sein, dass sed unter Panther noch --version oder -V versteht. Sicher aber funktioniert -V oder --version in Tiger nicht.
 
@maceis:
Photon:~ thgoebel$ uname -a
Darwin Photon.local 8.3.0 Darwin Kernel Version 8.3.0: Mon Oct 3 20:04:04 PDT 2005; root:xnu-792.6.22.obj~2/RELEASE_PPC Power Macintosh powerpc

Photon:~ thgoebel$ sed -V
GNU sed version 4.0.5
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.


/edit: Mac OSX 10.4.3...
 
Zuletzt bearbeitet:
Zurück
Oben Unten