Gibt es ein Problem mit sed und New Line Character?
Ich habe eine Datei test.txt mit folgendem Inhalt
aaaaa
bbbbb
ccccc
ddddd
Folgendes funktioniert nicht:
sed -r -i 's/\n/,/g' test.txt
Ich weiß, dass ich das verwenden kann, tr
aber meine Frage ist, warum es mit sed nicht möglich scheint.
Wenn dies ein Nebeneffekt der zeilenweisen Verarbeitung der Datei ist, würde mich interessieren, warum dies geschieht. Ich denke, grep
neue Zeilen entfernt. Macht sed dasselbe?
tr
,
Füge ein Trailing hinzu und gebe eine nicht abgeschlossene Zeile aus. Am besten verwenden Siepaste
stattdessen:paste -sd , test.txt
Antworten:
Mit GNU
sed
undPOSIXLY_CORRECT
nicht in der Umgebung bereitgestellt (für einzeilige Eingabe):Von https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n :
:a
N
$!ba
($!
bedeutet, dass Sie dies nicht in der letzten Zeile tun müssen (da es eine letzte neue Zeile geben sollte)).quelle
ba: Event not found
sed
Befehl mit genau diesen Optionen ausgeführt? In welchertest.txt
Datei? Mit welcher Version vonsed
(trysed --version
)?!
. Interessanterweise hat das bei mir immer noch nicht funktioniert und ich musste das!
in meinem.csh
Drehbuch verdoppeln . Ich habe im Moment kein wirkliches Problem, aber wissen Sie, warum das so sein könnte? Was für mich funktioniert hat warsed :a;N;$\\!ba;s/\n/ /g'
Dies funktioniert mit GNU
sed
:-z
ist enthalten seit 4.2.2NB.
-z
Ändert das Trennzeichen in Nullzeichen (\0
). Wenn Ihre Eingabe keine Nullzeichen enthält, wird die gesamte Eingabe als einzelne Zeile behandelt. Dies kann mit Einschränkungen verbunden sein .Um zu vermeiden, dass die neue Zeile der letzten Zeile ersetzt wird, können Sie sie zurücksetzen:
(Das ist wieder die GNU-
sed
Syntax, aber das macht nichts, da das Ganze nur GNU ist.)quelle
Von der Oracle-Website:
Grundsätzlich bedeutet dies, dass das Zeilenumbruchzeichen nicht übereinstimmt, da sed zeilenweise liest.
Die Lösung von https://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n lautet:
oder, in einer portablen Version (ohne
;
Verkettung nach Sprungmarkenbeschriftungen)Eine Erklärung dazu finden Sie auf dieser Seite.
quelle
sed
Wenn POSIXLY_CORRECT in der Umgebung vorhanden ist und die Eingabe nur eine Zeile enthält, erfolgt keine Ausgabe.sed
\n
Entfernt die nachgestellte ewline immer unmittelbar vor dem Auffüllen des Musterbereichs und hängt sie an, bevor die Ergebnisse des Skripts geschrieben werden. Eine\n
ewline kann auf verschiedene Weise im Pattern-Space vorhanden sein - aber niemals, wenn sie nicht das Ergebnis einer Bearbeitung ist. Dies ist wichtig -\n
E-Linien imsed
Musterbereich spiegeln immer eine Änderung wider und treten niemals im Eingabestream auf.\n
ewlines sind die einzigen Begrenzer, auf die sich ein Benutzersed
bei unbekannter Eingabe verlassen kann.Wenn Sie alle
\n
ewlines durch Kommas ersetzen möchten und Ihre Datei nicht sehr groß ist, können Sie Folgendes tun:Damit wird jede Eingabezeile nach einem ewline-Zeichen an das
h
alte Leerzeichen angehängt - mit Ausnahme der ersten, die stattdessen dash
alte Leerzeichen überschreibt\n
. Anschließend wirdd
jede Zeile, die nicht die$!
letzte ist, aus der Ausgabe gelöscht . In der letzten Zeile werdenH
alte und Muster-Leerzeichenx
geändert und alle\n
ewline-Zeicheny///
in Kommas übersetzt.Bei großen Dateien führt dies zwangsläufig zu Problemen mit
sed
dem Puffer an den Zeilengrenzen, die mit Aktionen dieser Art leicht überlaufen werden können.quelle
Alternativ können Sie eine etwas einfachere Syntax verwenden:
... einfach die Reihenfolge ändern.
quelle
s
Befehl jedoch für jede Eingabezeile in einem Musterbereich aus, der immer größer wird.Es gibt einige sehr schöne sed Magie hier. Und einige gute Punkte zum Musterraumüberlauf. Ich liebe es, sed zu verwenden, auch wenn es nicht der einfachste Weg ist, weil es so kompakt und leistungsstark ist. Es hat jedoch seine Grenzen und für große Datenmengen müsste der Musterraum mahoosiv sein.
GNU sagt dies:
Ich habe nicht viel hinzuzufügen, aber ich möchte Sie auf meinen Reiseführer für sed hinweisen . Es ist exzellent. http://www.grymoire.com/Unix/Sed.html
Und hier ist meine Lösung:
Nun, es funktioniert
quelle
Angenommen, Sie möchten Zeilenumbrüche durch ersetzen
\n
. Das wollte ich tun, also habe ich Folgendes getan:Hier ist, was es tut: für alle Zeilen mit Ausnahme der letzten , anhängen
\n
. Dann löschen Sie Zeilenumbrüche mittr
.quelle
-r
ist nur in GNU verfügbarsed
, nicht in BSD.