Schnelle Antwort
sed ':a;N;$!ba;s/\n/ /g' file
- : a Erstelle ein Label 'a'
- N Fügen Sie die nächste Zeile an den Musterbereich an
- $! wenn nicht die letzte Zeile , ba Zweig (go to) Label 'a'
- s Ersatz , / \ n / Regex für neue Zeile , / / durch ein Leerzeichen , / g globale Übereinstimmung (so oft es geht)
sed durchläuft die Schritte 1 bis 3, bis die letzte Zeile erreicht ist, wobei alle Zeilen in den Musterbereich passen, in dem sed alle \ n Zeichen ersetzt
Alternativen
Im Gegensatz zu sed müssen alle Alternativen nicht die letzte Zeile erreichen, um den Prozess zu starten
mit Bash , langsam
while read line; do printf "%s" "$line "; done < file
mit perl , sed- ähnlicher Geschwindigkeit
perl -p -e 's/\n/ /' file
mit tr , schneller als sed , kann nur durch ein Zeichen ersetzt werden
tr '\n' ' ' < file
mit Einfügen , tr- ähnliche Geschwindigkeit, kann nur durch ein Zeichen ersetzt werden
paste -s -d ' ' file
mit awk , tr- ähnlicher Geschwindigkeit
awk 1 ORS=' ' file
Eine andere Alternative wie "echo $ (<Datei)" ist langsam, funktioniert nur bei kleinen Dateien und muss die gesamte Datei verarbeiten, um den Prozess zu starten.
5.10. Warum kann ich eine neue Zeile nicht mit der Escape-
Sequenz \ n abgleichen oder löschen ? Warum kann ich mit \ n nicht zwei oder mehr Zeilen abgleichen?
Das \ n wird niemals mit der neuen Zeile am
Zeilenende übereinstimmen , da die neue Zeile immer entfernt wird, bevor die Zeile in den
Musterbereich eingefügt wird . Verwenden Sie
den Befehl 'N' oder ähnliches (z. B. 'H; ...; g;'), um zwei oder mehr Zeilen in den Musterraum zu bringen .
Sed funktioniert folgendermaßen: sed liest jeweils eine Zeile,
schneidet die abschließende neue Zeile ab , fügt die verbleibenden Elemente in den Musterbereich ein, in dem
das sed-Skript sie adressieren oder ändern kann, und
hängt beim Drucken des Musterbereichs eine neue Zeile an stdout an (oder zu einer Datei). Wenn der
Musterbereich mit 'd' oder 'D' ganz oder teilweise gelöscht wird,
wird in solchen Fällen die neue Zeile nicht hinzugefügt. So mögen Skripte
sed 's/\n//' file # to delete newlines from each line
sed 's/\n/foo\n/' file # to add a word to the end of each line
funktioniert NIEMALS, da die nachfolgende neue
Zeile entfernt wird, bevor
die Zeile in den Musterbereich eingefügt wird .
Verwenden Sie stattdessen eines der folgenden Skripte, um die oben genannten Aufgaben auszuführen :
tr -d '\n' < file # use tr to delete newlines
sed ':a;N;$!ba;s/\n//g' file # GNU sed to delete newlines
sed 's/$/ foo/' file # add "foo" to end of each line
Da andere Versionen von sed als GNU sed die Größe des Musterpuffers einschränken
, ist hier das Unix-Dienstprogramm 'tr' zu bevorzugen.
Wenn die letzte Zeile der Datei eine neue Zeile enthält, fügt GNU sed
diese neue Zeile zur Ausgabe hinzu, löscht jedoch alle anderen, während tr
alle neuen Zeilen löscht.
Um einen Block mit zwei oder mehr Zeilen abzugleichen, gibt es drei grundlegende Möglichkeiten:
(1) Verwenden Sie den Befehl 'N', um die nächste Zeile zum Musterbereich hinzuzufügen.
(2) Verwenden Sie den Befehl 'H' mindestens zweimal, um die aktuelle Zeile
an den Haltebereich anzuhängen , und rufen Sie dann die Zeilen
mit x, g oder G aus dem Haltebereich ab . oder (3) Adressbereiche verwenden (siehe Abschnitt 3.3 oben)
, um Zeilen zwischen zwei angegebenen Adressen abzugleichen.
Durch Auswahl von (1) und (2) wird ein \ n in den Musterraum
eingefügt , wo es wie gewünscht adressiert werden kann ('s / ABC \ nXYZ / alphabet / g'). Ein Beispiel
für die Verwendung von 'N' zum Löschen eines Zeilenblocks finden Sie in Abschnitt 4.13
("Wie lösche ich einen Block bestimmter aufeinanderfolgender Zeilen?"). Dieses
Beispiel kann geändert werden, indem der Löschbefehl in etwas
anderes geändert wird , z. B. 'p' (Drucken), 'i' (Einfügen), 'c' (Ändern), 'a' (Anhängen)
oder 's' (Ersetzen). .
Mit Auswahl (3) wird kein \ n in den Musterbereich eingefügt, es stimmt jedoch
mit einem Block aufeinanderfolgender Zeilen überein. Daher
benötigen Sie möglicherweise nicht einmal das \ n, um das Gesuchte zu finden. Seit GNU sed unterstützt
Version 3.02.80 diese Syntax:
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
Zusätzlich zu den herkömmlichen Bereichsadressen '/ from here /, / to there / {...}'
kann die Verwendung von \ n möglicherweise vollständig vermieden werden.
tr
ist nur dann das richtige Werkzeug für den Job, wenn ein einzelnes Zeichen durch ein einzelnes Zeichen ersetzt wird, während das obige Beispiel zeigt, wie Zeilenumbrüche durch Leerzeichen ersetzt werden. Im obigen Beispiel könnte tr funktionieren. Dies würde jedoch später einschränken.