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?

5voto

mor Punkte 51

In manchen Situationen können Sie vielleicht die RS zu einer anderen Zeichenkette oder einem anderen Zeichen. Auf diese Weise, \n ist für sub/gsub verfügbar:

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

Das Besondere an Shell-Skripten ist, dass man, wenn man nicht weiß, wie es geht, es auf eine andere Art und Weise tun kann. Und oft muss man mehr Dinge 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 mir scheint, dass gawk mit einer Zeile zur Zeit arbeitet und sehr sehr schnell ist (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.

5voto

Proximo Punkte 5406

Sucht und ersetzt unter Verwendung der Erlaubnis \n

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

Markierung

Wird zu

# Marker Kommentar

Markierung

5voto

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

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

Die folgende Lösung vermeidet sed und konvertiert stattdessen die Eingabebytes in Oktalcodes und dann wieder in Bytes, fängt aber den Oktalcode 012 (Zeilenumbruch) ab und gibt stattdessen die Ersatzzeichenfolge aus. Soweit ich das beurteilen kann, ist die Lösung POSIX-konform, so dass sie auf einer Vielzahl von Plattformen funktionieren sollte.

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 , lesen , [[](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html) , printf .

Ambos read , [ y printf sind zumindest in der Bash eingebaut, aber das ist wahrscheinlich nicht durch POSIX garantiert, so dass es auf einigen Plattformen sein kann, dass jedes Eingabebyte einen oder mehrere neue Prozesse startet, was die Dinge verlangsamt. Selbst in Bash erreicht diese Lösung nur etwa 50 kB/s, ist also nicht für große Dateien geeignet.

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

4voto

cnst Punkte 23716

Sie könnten verwenden xargs - es ersetzt \n standardmäßig mit einem Leerzeichen.

Es wäre jedoch problematisch, wenn Ihre Eingabe einen Fall von unterminated quote z.B. wenn die Anführungszeichen in einer bestimmten Zeile nicht übereinstimmen.

3voto

kralyk Punkte 3983

Awk verwenden:

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

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