Gibt es ein Problem mit sed und neuen Zeilenzeichen?
Ich habe eine Datei test.txt mit folgendem Inhalt
aaaaa
bbbbb
ccccc
ddddd
Das Folgende funktioniert nicht:
sed -r -i 's/\n/,/g' test.txt
Ich weiß, dass ich tr
dafür verwenden kann, aber meine Frage ist, warum es mit sed nicht möglich zu sein scheint.
Wenn dies ein Nebeneffekt der zeilenweisen Verarbeitung der Datei ist, würde es mich interessieren, warum dies passiert. Ich denke, grep
entfernt neue Zeilen. Macht sed dasselbe?
Mit GNU sed
und vorausgesetzt POSIXLY_CORRECT
ist nicht in der Umgebung (bei einzeiliger Eingabe):
sed -i ':a;N;$!ba;s/\n/,/g' test.txt
Von https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n:
:a
erstellenN
an den Musterbereich an$!ba
($!
bedeutet, dass wir es nicht in der letzten Zeile machen sollen (da es einen letzten Zeilenumbruch geben sollte)).Von Oracle's Website:
Das Dienstprogramm sed liest eine Datei Zeile für Zeile nacheinander in den Speicher ein. Anschließend führt es alle für die Zeile angegebenen Aktionen aus und gibt die Zeile mit den gewünschten Änderungen zurück in den Speicher und an das Terminal aus. Nachdem alle Aktionen für diese eine Zeile durchgeführt wurden, liest es die nächste Zeile der Datei und wiederholt den Vorgang, bis es mit der Datei fertig ist.
Da sed Zeile für Zeile liest, wird das Newline-Zeichen nicht berücksichtigt.
Die Lösung von https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n lautet:
sed ':a;N;$!ba;s/\n/,/g'
oder, in einer portablen Version (ohne ;
Verkettung nach Sprungmarken)
sed -e ':a' -e 'N;$!ba' -e 's/\n/,/g'
Eine Erklärung, wie das funktioniert, finden Sie auf dieser Seite.
Alternativ können Sie auch eine etwas einfachere Syntax verwenden:
sed ':a;N;s/\n/,/g;ba'
...nur die Reihenfolge ändern.