it-swarm.com.de

Wie kann ich eine neue Zeile (\ n) mit sed ersetzen?

Wie kann ich eine neue Zeile ("\n") mit dem Befehl sed durch ein Leerzeichen ("") ersetzen?

Ich habe erfolglos versucht:

sed 's#\n# #g' file
sed 's#^$# #g' file

Wie behebe ich das?

1255
hhh

Verwenden Sie diese Lösung mit GNU sed:

sed ':a;N;$!ba;s/\n/ /g' file

Dadurch wird die gesamte Datei in einer Schleife gelesen und die neuen Zeilen durch ein Leerzeichen ersetzt.

Erläuterung:

  1. Erstellen Sie ein Label mit :a.
  2. Fügen Sie die aktuelle und nächste Zeile mit N an den Musterbereich an.
  3. Wenn wir uns vor der letzten Zeile befinden, verzweigen Sie zum erstellten Label $!ba ($! bedeutet, dass Sie dies nicht in der letzten Zeile tun, da es eine letzte neue Zeile geben sollte).
  4. Schließlich ersetzt die Ersetzung jede neue Zeile durch ein Leerzeichen im Musterraum (das ist die gesamte Datei).

Hier ist eine plattformübergreifende kompatible Syntax, die mit BSD und OS Xs sed (gemäß @ Benjie comment ) funktioniert:

sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' file

Wie Sie sehen, ist die Verwendung von sed für dieses ansonsten einfache Problem problematisch. Für eine einfachere und adäquate Lösung siehe diese Antwort .

1411
Zsolt Botykai

Verwenden Sie stattdessen tr?

tr '\n' ' ' < input_filename

oder entfernen Sie die Zeilenumbrüche komplett:

tr -d '\n' < input.txt > output.txt

oder wenn Sie die GNU -Version haben (mit ihren langen Optionen)

tr --delete '\n' < input.txt > output.txt
1612
dmckee

Schnelle Antwort:

sed ':a;N;$!ba;s/\n/ /g' file
  1. : a Erstellt eine Bezeichnung 'a'
  2. N füge die nächste Zeile an den Musterraum an
  3. $! wenn nicht die letzte Zeile , ba Zweig (gehe zu) Label 'a'
  4. s ersetzen , /\ n/ Regex für neue Zeile , // von ein Leerzeichen , /g globale Übereinstimmung (so oft es kann)

sed durchläuft die Schritte 1 bis 3, bis die letzte Zeile erreicht ist. Dabei werden alle Zeilen in den Musterbereich eingefügt, in dem sed alle\n Zeichen ersetzt


Alternativen :

Alle Alternativen müssen im Gegensatz zu sed 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 - 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 - Geschwindigkeit, kann nur durch ein Zeichen ersetzt werden

paste -s -d ' ' file

mit awk , tr - like speed

awk 1 ORS=' ' file

Andere Alternativen wie "echo $ (<file)" sind langsam, funktionieren nur bei kleinen Dateien und müssen die gesamte Datei verarbeiten, um den Vorgang zu starten.


Lange Antwort von sed FAQ 5.1 :

5.10. Warum kann ich mit der Escape-Taste\n keine neue Zeile finden oder löschen?
Reihenfolge? Warum kann ich mit\n nicht zwei oder mehr Zeilen abgleichen?

\ N wird nie mit dem Zeilenumbruch am Zeilenende übereinstimmen, da
Zeilenvorschub wird immer entfernt, bevor der Zeilenvorschub in das Feld eingefügt wird
Musterraum. Verwenden Sie, um 2 oder mehr Linien in den Musterbereich zu bringen
das 'N' Kommando oder ähnliches (wie 'H; ...; g;').

Sed funktioniert so: sed liest eine Zeile nach der anderen, schneidet die ab
beende newline, füge was übrig bleibt in den musterraum wo
Das sed-Skript kann es adressieren oder ändern, und wenn das Muster leer ist
wird gedruckt, eine neue Zeile wird an stdout (oder an eine Datei) angehängt. Wenn die
Mit 'd' oder 'D' wird der Musterraum ganz oder teilweise gelöscht
newline wird in solchen Fällen 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 der abschließende Zeilenumbruch vor entfernt wird
Die Linie wird in den Musterraum eingefügt. Um die oben genannten Aufgaben auszuführen,
Verwenden Sie stattdessen eines dieser Skripte:

  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 Grenzen für die Größe von haben
Als Pattern Buffer ist hier das Unix 'tr' Utility vorzuziehen.
Wenn die letzte Zeile der Datei eine neue Zeile enthält, wird GNU sed hinzugefügt
die neue Zeile in der Ausgabe, aber alle anderen löschen, wohingegen tr wird
lösche alle Zeilenumbrüche.

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 in den Musterbereich einzufügen.
(2) Verwenden Sie den Befehl 'H' mindestens zweimal, um die aktuelle Zeile anzufügen
zum Laderaum, und rufen Sie dann die Zeilen aus dem Laderaum ab
mit x, g oder G; oder (3) Adressbereiche verwenden (siehe Abschnitt 3.3 oben)
, um Zeilen zwischen zwei angegebenen Adressen abzugleichen.

Mit den Optionen (1) und (2) wird ein\n in den Musterbereich eingefügt, in dem es sich befindet
kann wie gewünscht angesprochen werden ('s/ABC\nXYZ/alphabet/g'). Ein Beispiel
der Verwendung von 'N' zum Löschen eines Zeilenblocks erscheint in Abschnitt 4.13
("Wie lösche ich einen Block von bestimmten aufeinanderfolgenden Zeilen?"). Diese
Das Beispiel kann geändert werden, indem der Befehl delete in irgendetwas geändert wird
sonst wie 'p' (print), 'i' (insert), 'c' (change), 'a' (append),
oder 's' (Ersatz).

Wahl (3) fügt kein\n in den Musterbereich ein, aber es tut
stimmen mit einem Block aufeinanderfolgender Zeilen überein, so dass es sein kann, dass Sie dies nicht tun
brauchen sogar die\n, um zu finden, wonach Sie suchen. Seit GNU sed
Version 3.02.80 unterstützt jetzt diese Syntax:

  sed '/start/,+4d'  # to delete "start" plus the next 4 lines,           

zusätzlich zum traditionellen '/ from here /,/to there/{...}' Bereich
Bei Adressen kann die Verwendung von\n möglicherweise ganz vermieden werden.

455
hdorio

Eine kürzere awk Alternative:

awk 1 ORS=' '

Erläuterung

Ein awk-Programm besteht aus Regeln, die aus bedingten Codeblöcken bestehen, d.h.

condition { code-block }

Wenn der Codeblock weggelassen wird, wird der Standardwert verwendet: { print $0 }. Somit wird der 1 als wahrer Zustand interpretiert und print $0 wird für jede Zeile ausgeführt.

Wenn awk die Eingabe liest, wird sie basierend auf dem Wert von RS (Datensatztrennzeichen) in Datensätze aufgeteilt. Dies ist standardmäßig eine neue Zeile. Daher analysiert awk die Eingabe standardmäßig zeilenweise. Die Aufteilung umfasst auch das Entfernen von RS aus dem Eingabedatensatz.

Wenn Sie jetzt einen Datensatz drucken, wird ORS (Output Record Separator) an den Datensatz angehängt. Die Standardeinstellung ist wieder eine neue Zeile. Wenn Sie also ORS in ein Leerzeichen ändern, werden alle Zeilenumbrüche in Leerzeichen geändert.

212
Thor

gnu sed hat die Option -z für durch Nullen getrennte Datensätze (Zeilen). Sie können einfach anrufen:

sed -z 's/\n/ /g'
124
JJoao

Die Perl -Version funktioniert so, wie Sie es erwartet haben.

Perl -i -p -e 's/\n//' file

Wie in den Kommentaren erwähnt, ist es erwähnenswert, dass diese Änderungen vorgenommen wurden. -i.bak erstellt vor dem Ersetzen eine Sicherungskopie der Originaldatei, falls Ihr regulärer Ausdruck nicht so intelligent ist, wie Sie dachten.

84
ire_and_curses

Wer braucht sed? Hier ist der bash Weg:

cat test.txt |  while read line; do echo -n "$line "; done
44
commonpike

Um alle Zeilenumbrüche mit awk durch Leerzeichen zu ersetzen, ohne die gesamte Datei in den Speicher einzulesen:

awk '{printf "%s ", $0}' inputfile

Wenn Sie einen letzten Zeilenumbruch wünschen:

awk '{printf "%s ", $0} END {printf "\n"}' inputfile

Sie können ein anderes Zeichen als ein Leerzeichen verwenden:

awk '{printf "%s|", $0} END {printf "\n"}' inputfile
24
tr '\n' ' ' 

ist der Befehl.

Einfach und leicht zu bedienen.

21
Dheeraj R

Drei Dinge.

  1. tr (oder cat usw.) wird absolut nicht benötigt. (GNU) sed und (GNU) awk können in Kombination 99,9% aller von Ihnen benötigten Textverarbeitungen ausführen.

  2. stream! = zeilenbasiert. ed ist ein zeilenbasierter Editor. sed ist nicht. Siehe sed lecture für weitere Informationen zum Unterschied. Die meisten Leute verwechseln sed als zeilenbasiert, da die Mustererkennung für SIMPLE-Übereinstimmungen standardmäßig nicht sehr scharf ist - zum Beispiel beim Durchsuchen und Ersetzen von Mustern durch ein oder zwei Zeichen, standardmäßig nur Ersetzt bei der ersten gefundenen Übereinstimmung (sofern vom globalen Befehl nicht anders angegeben). Es würde nicht einmal einen globalen Befehl geben, wenn er zeilenbasiert und nicht STREAM-basiert wäre, da immer nur Zeilen ausgewertet würden. Versuchen Sie, ed auszuführen. Sie werden den Unterschied bemerken. ed ist sehr nützlich, wenn Sie bestimmte Zeilen durchlaufen möchten (z. B. in einer for-Schleife), aber in den meisten Fällen nur sed.

  3. Davon abgesehen

    sed -e '{:q;N;s/\n/ /g;t q}' file
    

    funktioniert einwandfrei in GNU sed Version 4.2.1. Der obige Befehl ersetzt alle Zeilenumbrüche durch Leerzeichen. Es ist hässlich und etwas umständlich einzutippen, aber es funktioniert einwandfrei. Die {} können weggelassen werden, da sie nur aus Gründen der Vernunft enthalten sind.

21
brent saner

Die Antwort mit dem: ein Etikett ...

Wie kann ich eine neue Zeile (\ n) mit sed ersetzen?

... funktioniert nicht in freebsd 7.2 auf der Kommandozeile:

 (echo foo; echo bar) | sed ': a; N; $! ba; s/\ n// g'[.____.₱sed: 1: ": a; N; $! ba; s/\ n// g": unbenutztes Label' a; N; $! ba; s/\ n// g'[.____.‹foo[.____.‹bar

Aber wenn Sie das sed-Skript in eine Datei einfügen oder -e verwenden, um das sed-Skript zu "erstellen" ...

> (echo foo; echo bar) | sed -e: a -e N -e '$! ba' -e 's/\ n//g'[.____.‹foo bar 

oder ...

> cat > x.sed << eof
:a
N
$!ba
s/\n/ /g
eof

> (echo foo; echo bar) | sed -f x.sed
foo bar

Vielleicht ist das Sed in OS X ähnlich.

12
Juan

Sie können xargs verwenden:

seq 10 | xargs

oder

seq 10 | xargs echo -n
11

Einfach zu verstehende Lösung

Ich hatte dieses Problem. Der Kicker war, dass ich die Lösung brauchte, um auf BSD (Mac OS X) und GNU (Linux und Cygwin ) sed und tr zu arbeiten:

$ echo 'foo
bar
baz


foo2
bar2
baz2' \
| tr '\n' '\000' \
| sed 's:\x00\x00.*:\n:g' \
| tr '\000' '\n'

Ausgabe:

foo
bar
baz

(hat nachgestellte Newline)

Es funktioniert unter Linux, OS X und BSD - auch ohne TF-8 Unterstützung oder mit einem beschissenen Terminal.

  1. Verwenden Sie tr, um die neue Zeile mit einem anderen Zeichen zu tauschen.

    NULL (\000 oder \x00) ist in Ordnung, da es keine UTF-8-Unterstützung benötigt und wahrscheinlich nicht verwendet wird.

  2. Verwenden Sie sed, um mit NULL übereinzustimmen.

  3. Verwenden Sie tr, um zusätzliche Zeilenumbrüche zurückzutauschen, wenn Sie sie benötigen

11
CoolAJ86

Ich bin kein Experte, aber in sed müssten Sie zuerst die nächste Zeile in den Musterbereich einfügen, indem Sie "N" verwenden. Aus dem Abschnitt "Multiline Pattern Space" in "Advanced sed Commands" des Buches sed & awk (Dale Dougherty und Arnold Robbins; O'Reilly 1997; Seite 107 in die Vorscha =):

Mit dem Befehl Mehrzeilig Weiter (N) wird ein mehrzeiliger Musterraum erstellt, indem eine neue Eingabezeile gelesen und an den Inhalt des Musterraums angehängt wird. Der ursprüngliche Inhalt des Musterbereichs und die neue Eingabezeile werden durch eine neue Zeile getrennt. Das eingebettete Zeilenumbruchzeichen kann durch die Escape-Sequenz "\ n" in Mustern abgeglichen werden. In einem mehrzeiligen Musterraum stimmt das Metazeichen "^" mit dem allerersten Zeichen des Musterraums überein und nicht mit den Zeichen, die auf eingebettete Zeilenumbrüche folgen. In ähnlicher Weise stimmt "$" nur mit der letzten Zeile im Musterraum überein und nicht mit eingebetteten Zeilenumbrüchen. Nachdem der Befehl Weiter ausgeführt wurde, wird die Steuerung an nachfolgende Befehle im Skript übergeben.

Aus man sed:

[2addr] N

Fügen Sie die nächste Eingabezeile in den Musterbereich ein, und trennen Sie das angehängte Material mit einem eingebetteten Zeilenumbruchzeichen vom ursprünglichen Inhalt. Beachten Sie, dass sich die aktuelle Zeilennummer ändert.

Ich habe dies verwendet , um (mehrere) falsch formatierte Protokolldateien zu durchsuchen, in denen die Suchzeichenfolge in einer "verwaisten" nächsten Zeile gefunden werden kann.

9
Arjan

In Reaktion auf die oben genannte "tr" -Lösung unter Windows (wahrscheinlich unter Verwendung der Gnuwin32-Version von tr) lautet die vorgeschlagene Lösung:

tr '\n' ' ' < input

hat bei mir nicht funktioniert, es ist entweder ein Fehler aufgetreten oder\nw/'' wurde aus irgendeinem Grund ersetzt.

Unter Verwendung einer anderen Funktion von tr hat die Option "delete" -d jedoch funktioniert:

tr -d '\n' < input

oder '\ r\n' anstelle von '\ n'

6
John Lawler

Ich habe einen hybriden Ansatz gewählt, um die Newline-Sache zu umgehen, indem ich tr verwende, um Newlines durch Tabulatoren zu ersetzen, und dann Tabulatoren durch das ersetzen, was ich will. In diesem Fall, "
", da ich versuche, HTML-Umbrüche zu generieren.

echo -e "a\nb\nc\n" |tr '\n' '\t' | sed 's/\t/ <br> /g'`
6
rfengr

In einigen Situationen können Sie RS in eine andere Zeichenfolge oder ein anderes Zeichen ändern. Auf diese Weise ist\n für sub/gsub verfügbar:

$ gawk 'BEGIN {RS="dn" } {gsub("\n"," ") ;print $0 }' file

Die Stärke von Shell-Skripten besteht darin, dass Sie es auf eine andere Art und Weise tun können, wenn Sie nicht wissen, wie Sie es auf eine andere Art und Weise tun sollen. Und oft müssen Sie mehr berücksichtigen, als eine komplexe Lösung für ein einfaches Problem zu finden.

Bezüglich der Sache, dass Gawk langsam ist ... und die Datei in den Speicher liest, weiß ich das nicht, aber für mich scheint Gawk mit einer Zeile zu arbeiten und ist sehr sehr schnell (nicht so schnell wie einige der anderen , aber die Zeit zum Schreiben und Testen zählt auch).

Ich verarbeite MB und sogar GB an Daten, und die einzige Grenze, die ich gefunden habe, ist die Zeilengröße.

5
mor

Kugelsichere Lösung. Binärdatensicher und POSIX-konform, aber langsam.

POSIX sed erfordert Eingaben gemäß den Definitionen POSIX-Textdatei und POSIX-Zeile , daher sind NULL-Bytes und zu lange Zeilen und jede Zeile nicht zulässig muss mit einer neuen Zeile (einschließlich der letzten Zeile) enden. Dies macht es schwierig, sed für die Verarbeitung beliebiger Eingabedaten zu verwenden.

Die folgende Lösung vermeidet sed und konvertiert stattdessen die eingegebenen Bytes in Oktalcodes und dann wieder in Bytes, fängt jedoch den Oktalcode 012 (Zeilenvorschub) ab und gibt stattdessen die Ersatzzeichenfolge aus. Soweit ich weiß, ist die Lösung POSIX-kompatibel und sollte daher auf einer Vielzahl von Plattformen funktionieren.

od -A n -t o1 -v | tr ' \t' '\n\n' | grep . |
  while read x; do [ "0$x" -eq 012 ] && printf '<br>\n' || printf "\\$x"; done

POSIX-Referenzdokumentation: sh , Shell-Befehlssprache , od , tr , grep , read , [ , printf .

Beide read, [ und printf sind in mindestens bash integriert, aber dies wird wahrscheinlich von POSIX nicht garantiert. Auf einigen Plattformen kann es daher vorkommen, dass jedes Eingabebyte gestartet wird ein oder mehrere neue Prozesse, die die Dinge verlangsamen. Selbst in Bash erreicht diese Lösung nur etwa 50 kB/s und ist daher nicht für große Dateien geeignet.

Getestet unter Ubuntu (bash, dash und busybox), FreeBSD und OpenBSD.

5

Sie können xargs verwenden - dabei wird \n standardmäßig durch ein Leerzeichen ersetzt.

Es würde jedoch Probleme geben, wenn Ihre Eingabe einen unterminated quote enthält, z. wenn die Anführungszeichen in einer bestimmten Zeile nicht übereinstimmen.

4
cnst

Wenn Sie das Pech haben, mit Windows-Zeilenenden fertig zu werden, müssen Sie den \r und den \n entfernen.

tr '[\r\n]' ' ' < $input > $output
4
StevenWernerCS

Sucht und ersetzt mit\n

sed -ie -z 's/Marker\n/# Marker Comment\nMarker\n/g' myfile.txt

Marker

Wird

# Markierung Kommentar

Marker

3
Proximo

Eine Lösung, die mir besonders gefällt, besteht darin, alle Dateien im Hold-Bereich anzuhängen und alle Zeilenumbrüche am Ende der Datei zu ersetzen:

$ (echo foo; echo bar) | sed -n 'H;${x;s/\n//g;p;}'
foobar

Allerdings hat mir jemand gesagt, dass der Laderaum in einigen sed-Implementierungen endlich sein kann.

3
brandizzi

Awk benutzen:

awk "BEGIN { o=\"\" }  { o=o \" \" \$0 }  END { print o; }"
3
kralyk

Ersetzen Sie Zeilenumbrüche durch eine beliebige Zeichenfolge und ersetzen Sie auch die letzte Zeile

Die reinen tr Lösungen können nur durch ein einzelnes Zeichen ersetzt werden, und die reinen sed Lösungen ersetzen nicht die letzte Zeile der Eingabe. Die folgende Lösung behebt diese Probleme und scheint für Binärdaten sicher zu sein (auch mit einem UTF-8-Gebietsschema):

printf '1\n2\n3\n' |
  sed 's/%/%p/g;s/@/%a/g' | tr '\n' @ | sed 's/@/<br>/g;s/%a/@/g;s/%p/%/g'

Ergebnis:

1<br>2<br>3<br>
3

Es ist sed, das die neuen Zeilen nach "normaler" Ersetzung einführt. Zuerst wird das Zeilenumbruchzeichen abgeschnitten, dann gemäß Ihren Anweisungen verarbeitet und anschließend eine neue Zeile eingefügt.

Mit sed können Sie "das Ende" einer Zeile (nicht das Zeichen für neue Zeilen) nach dem Trimmen durch eine Zeichenfolge Ihrer Wahl für jede Eingabezeile ersetzen. aber sed gibt verschiedene Zeilen aus. Angenommen, Sie möchten das "Zeilenende" durch "===" ersetzen (allgemeiner als das Ersetzen durch ein einzelnes Leerzeichen):

Prompt~$ cat <<EOF |sed 's/$/===/g'
first line
second line
3rd line
EOF

first line===
second line===
3rd line===
Prompt~$

Um das Zeichen für die neue Zeile durch den String zu ersetzen, können Sie, wie bereits erwähnt, ineffizienterweise tr verwenden, um die Zeichen für die neue Zeile durch ein "Sonderzeichen" zu ersetzen, und dann sed um das Sonderzeichen durch den gewünschten String zu ersetzen.

Zum Beispiel:

Prompt~$ cat <<EOF | tr '\n' $'\x01'|sed -e 's/\x01/===/g'
first line
second line
3rd line
EOF

first line===second line===3rd line===Prompt~$
3
Robert Vila

So entfernen Sie leere Zeilen:

sed -n "s/^$//;t;p;"
3
kralyk

Eine andere GNUsed Methode, fast die gleiche wie Zsolt Botykai 's Antwort , aber dies verwendet sed' s seltener verwendeter y (transliterate) Befehl, der ein Byte Code (den nachgestellten g) speichert:

sed ':a;N;$!ba;y/\n/ /'

Man würde hoffen, dass y schneller als s läuft (vielleicht mit tr Geschwindigkeiten, 20x schneller), aber in GNU sed v4.2.2y ist ungefähr 4% langsamer als s.


Portabler BSDsed version:

sed -e ':a' -e 'N;$!ba' -e 'y/\n/ /'
3
agc

Unter Mac OS X (mit FreeBSD sed):

# replace each newline with a space
printf "a\nb\nc\nd\ne\nf" | sed -E -e :a -e '$!N; s/\n/ /g; ta'
printf "a\nb\nc\nd\ne\nf" | sed -E -e :a -e '$!N; s/\n/ /g' -e ta
3
bashfu

Sie können diese Methode auch verwenden

sed 'x;G;1!h;s/\n/ /g;$!d'

Erläuterung

x   - which is used to exchange the data from both space (pattern and hold).
G   - which is used to append the data from hold space to pattern space.
h   - which is used to copy the pattern space to hold space.
1!h - During first line won't copy pattern space to hold space due to \n is
      available in pattern space.
$!d - Clear the pattern space every time before getting next line until the
      last line.

Fließen:
Wenn die erste Zeile von der Eingabe kommt, wird getauscht, also geht 1 in den Hold-Bereich und\n in den Pattern-Bereich, fügt dann den Hold-Bereich in den Pattern-Bereich ein und ersetzt und löscht das Pattern Platz.
Während des Austauschs der zweiten Zeile gehen 2 zum Halteplatz und 1 zum Musterplatz, dann G fügen Sie den Halteplatz in den Musterplatz ein, dann h kopieren Sie das Muster nach es wird eine ersetzung vorgenommen und gelöscht. Dieser Vorgang wird fortgesetzt, bis eof erreicht ist, und dann das genaue Ergebnis gedruckt.

2
Kalanidhi

@OP, wenn Sie Zeilenumbrüche in einer Datei ersetzen möchten, können Sie einfach dos2unix (oder unix2dox) verwenden

dos2unix yourfile yourfile
2
ghostdog74
sed '1h;1!H;$!d
     x;s/\n/ /g' YourFile

Dies funktioniert nicht für große Dateien (Pufferlimit), ist jedoch sehr effizient, wenn genügend Speicher für die Datei vorhanden ist. (Korrektur H-> 1h;1!H nach der guten Bemerkung von @hilojack)

Eine andere Version, die beim Lesen eine neue Zeile ändert (mehr CPU, weniger Speicher)

 sed ':loop
 $! N
 s/\n/ /
 t loop' YourFile
1
NeronLeVelu

Ich habe diese Antwort gepostet, weil ich mit den meisten der oben angegebenen sed Commend-Beispiele versucht habe, die in meiner Unix-Box nicht funktionieren und mir die Fehlermeldung Label too long: {:q;N;s/\n/ /g;t q} geben. Schließlich habe ich meine Anforderung gestellt und daher hier geteilt, was in allen Unix/Linux-Umgebungen funktioniert:

line=$(while read line; do echo -n "$line "; done < yoursourcefile.txt)
echo $line |sed 's/ //g' > sortedoutput.txt

Die erste Zeile entfernt alle neuen Zeilen aus der Datei yoursourcefile.txt und erzeugt eine einzelne Zeile. Mit dem zweiten Befehl sed werden alle Leerzeichen entfernt.

Sie können auch den Standard-Texteditor verwenden:

printf '%s\n%s\n%s\n' '%s/$/ /' '%j' 'w' | ed -s file

Hinweis: Dadurch wird das Ergebnis wieder in file gespeichert.

Wie bei sed muss bei dieser Lösung zunächst die gesamte Datei in den Speicher geladen werden.

0
Thor

Dies könnte für Sie funktionieren (GNU sed):

sed 'H;$!d;x;:a;s/^((.).*)\2/\1 /;ta;s/.//' file

Mit dem Befehl H wird dem Musterbereich eine neue Zeile vorangestellt und das Ergebnis an den Haltebereich angehängt. Der normale Ablauf von sed besteht darin, die folgende neue Zeile aus jeder Zeile zu entfernen. Dadurch wird eine neue Zeile am Anfang des Speicherbereichs eingefügt und der Rest der Datei repliziert. Sobald die Datei in den Aufbewahrungsraum geschlürft wurde, tauschen Sie den Aufbewahrungsraum gegen den Pattenraum aus und ersetzen Sie dann alle ursprünglichen Zeilenumbrüche durch Leerzeichen. Zum Schluss entfernen Sie den eingeführten Zeilenumbruch.

Dies hat den Vorteil, dass in den sed-Befehlen niemals ein Newline-String eingegeben wird.

0
potong