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