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?
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?
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>
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
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
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 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.