1729 Stimmen

Wie kann ich jeden Zeilenumbruch ( \n ) mit einem Leerzeichen mit sed?

Wie kann ich einen Zeilenumbruch (" \n ") mit einem Leerzeichen (" ") unter Verwendung der sed Befehl?

Ich habe es erfolglos versucht:

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

Wie kann ich es reparieren?

3voto

Ersetzt Zeilenumbrüche durch eine beliebige Zeichenkette und ersetzt auch den letzten Zeilenumbruch

Die reine tr Lösungen können nur durch ein einziges Zeichen ersetzt werden, und die reine sed Lösungen ersetzen nicht den letzten Zeilenumbruch der Eingabe. Die folgende Lösung behebt diese Probleme und scheint für binäre Daten sicher zu sein (sogar 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>

2voto

NeronLeVelu Punkte 9584
sed '1h;1!H;$!d
     x;s/\n/ /g' YourFile

Dies funktioniert nicht bei großen Dateien (Puffergrenze), ist aber sehr effizient, wenn genügend Speicherplatz für die Datei vorhanden ist. (Berichtigung H -> 1h;1!H nach der guten Bemerkung von @hilojack )

Eine andere Version, die beim Lesen eine neue Zeile einfügt (mehr Rechenleistung, weniger Speicher)

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

2voto

potong Punkte 51035

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

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

El H einen Zeilenumbruch vor den Musterbereich und hängt das Ergebnis dann an den Haltebereich an. Der normale Ablauf von sed besteht darin, den folgenden Zeilenumbruch aus jeder Zeile zu entfernen, so dass ein Zeilenumbruch am Anfang des hold-Bereichs eingefügt und der Rest der Datei repliziert wird. Sobald die Datei in den Hold-Space geschlürft wurde, tauschen Sie den Hold-Space mit dem Patten-Space aus und verwenden dann den Mustervergleich, um alle ursprünglichen Zeilenumbrüche durch Leerzeichen zu ersetzen. Schließlich entfernen Sie den eingeführten Zeilenumbruch.

Dies hat den Vorteil, dass innerhalb der sed-Befehle nie ein Zeilenumbruch eingegeben wird.

Alternativ:

sed 'H;$!d;x;y/\n/ /;s/.//' file

Oder:

sed 'H;1h;$!d;x;y/\n/ /' file

1voto

ghostdog74 Punkte 305138

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

dos2unix yourfile yourfile

1voto

Danny Varod Punkte 16437

Eine weitere Möglichkeit:

tr -s "[:space:]" " " < filename > filename2 && mv filename2 filename

Wo tr -s ist für:

-s, --squeeze-repeats ersetzt jede Folge eines sich wiederholenden Zeichens die im zuletzt angegebenen SET aufgeführt ist, durch ein einzelnes Vorkommen dieses Zeichens

Diese Verwendung ersetzt alle Leerzeichenfolgen in der Datei mit einem einzelnen Leerzeichen, schreibt das Ergebnis in eine neue Datei und benennt die neue Datei dann wieder in den ursprünglichen Namen um.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X