sed: Zeilenumbruch in der Ersetzung schreibt nur \n raus

tschloss

tschloss

Aktives Mitglied
Thread Starter
Dabei seit
14.04.2007
Beiträge
1.234
Reaktionspunkte
51
Hi,
ich habe eben versucht, ein paar alte Skripte (liefen bisher unter SUSE 9.3) auf einem Mac laufen zu lassen.

Eine Ersetzung der Baurt
Code:
sed "s/PATTERN/\n/"
funktioniert aber nicht mehr. Das "\n" wird literal eingefügt und nicht als chr(10).

Die Dateien (Quelldateien und Shell-Skript-Dateien mit den sed Befehlen) sind alle Unicode(UTF-8) without BOM, zumindest sagt Textwrangler das.

Weitere Backslashes vor dem "\n" machen es auch nicht besser....

Was mache ich falsch? Wie bekomme ich mein Newline in die Ausgabe?

Danke und Grüße
Thomas
 
Die BSD Variante von sed weicht doch sehr von Linux ab.
Unter Tiger hatte ich mir eine GNU Version gebaut. Sollte unter Leo auch funktionieren, habe es aber noch nicht ausprobiert.
 
die man page sagt:
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.
 
Hi,

\n wird mit STRG-V STRG-M maskiert, allerdings ist mir nicht klar was du eigentlich erreichen möchtest. Die komplette Zeile durch eine Leerzeile ersetzen kannst du mit 's/.*//'
Wenn du dagegen Leerzeilen einfügen möchtest, mußt du mit append oder insert arbeiten:
Datei a beinhaltet:

# cat a
eins
zwei
drei

# cat a|sed -e '/eins/i\ <ENTER>
'

eins
zwei
drei

Vor die erste Zeile wurde eine Leerzeile eingefügt.

Neue Zeile einfügen:

# cat a|sed -e '/eins/i\
> nullte Zeile'
nullte Zeile
eins
zwei
drei

Gruss
 
so kriegst du aber auch das die newline rein mit dem enter
Code:
sed 's/<PATTERN>/\<enter drücken>
 /'
 
Danke an die vielen Zuschriften.
Dass der sed das hier nicht kann ist traurig.
Leider weiss ich nicht, wie ich mir mal schnell einen GNU sed baue. Ich hoffe, dass ich nicht auf weitere EInschränkungen stoße...
Geht das mit dem literalen Zeilenvorschub im Zielteil des sed-Befehls wirklich?

Jedenfalls behelfe mich mir jetzt durch das Ersetzen in ein sonst nicht vorkommendes Zeichen und schicke dann einen "tr 'x' '\n'" hinterher.

Sonst nehme ich beim nächsten Mal gleich Perl.

VG Thomas

PS: Ich will natürlich einen Zeilenvorschub einfügen, nicht eine Zeile gegen eine leere ersetzen.
Es geht um die Umwandlung einer HTML-Tabelle in SQL-Insert-Statements, vor jedem "insert" ein newline bitte.
 
Geht das mit dem literalen Zeilenvorschub im Zielteil des sed-Befehls wirklich?

ja, ich hab das so auf ein plist file los gelassen:
cat blah.plist|sed 's/>/\
'

und die > waren dann durch newline ersetzt...
 
...
Dass der sed das hier nicht kann ist traurig.
...
Nein, das ist nicht traurig sondern standardkonform und entspricht der Unix Spezifikation SUSv3.
Traurig ist eher, dass die ganzen Gnuismen bei Linux (die dann z.T. selbst beim selben Programm untereinander nicht kompatible sind) bei vielen Benutzern den Eindruck erwecken, dass dies das "normale" Verhalten sei. Problematisch wird das insbes. dann, wenn man portable Skripte schreiben möchte/muss oder auf unterschiedlichen Systemen unterwegs ist.
 
+++ fullquoting entfernt +++
+++ der zitierte Beitrag steht doch unmittelbar darüber +++

...ok, dann sag ich es so: "Ich bin traurig..." ;)
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben Unten