Ich habe ein Dokument mit vielen leeren Zeilen.
Wie kann ich sie entfernen, wenn zwei oder mehr zusammen sind?
Ich habe versucht, sed "s/\n\n//"Datei, aber es hat nicht funktioniert. Kein Fehler.
Ich habe ein Dokument mit vielen leeren Zeilen.
Wie kann ich sie entfernen, wenn zwei oder mehr zusammen sind?
Ich habe versucht, sed "s/\n\n//"Datei, aber es hat nicht funktioniert. Kein Fehler.
Antworten:
Nur um leere Zeilen zu entfernen:
sed '/^$/d'
sedist zeilenorientiert, so dass das Denken in "2 oder mehr eines bestimmten Bytes" funktioniert, außer wenn dieses Byte eine neue Zeile ist. Dann muss man sich etwas überlegen, das für die ganze Linie funktioniert.
sedist in der Lage, mehrere Zeilen über die Funktion "Pattern Space" / "Hold Space" zu verarbeiten. Aber ich finde das zu kompliziert. ;-)
1!(mit Ausnahme von Zeile 1 mit allen übereinstimmen) sed '1!{/^$/d'}.
sed. Durch das Erstellen einer Datei werden im Wesentlichen alle vorhandenen Dateien mit demselben Namen gelöscht. sed '/^&/d' file.txt > otherfile.txtwird funktionieren.
Keine Notwendigkeit für sed. grepWird besorgt:
grep .
(das grepist SPC, Punkt, das entspricht jeder Zeile, die mindestens ein Zeichen enthält).
Es gibt auch:
tr -s '\n'
(Drücken Sie eine beliebige Folge von Zeilenumbrüchen zusammen).
Wie von Chris bemerkt, sind beide nicht gleichbedeutend, da das Entfernen von Leerzeilen (wie die erste Lösung oben und die meisten anderen hier behandelten Antworten) nicht dasselbe ist wie das Drücken von Folgen von Zeilenumbrüchen, wie es verlangt wird, wenn die erste Zeile leer ist Es wird nur ein führendes Zeilenumbruchzeichen benötigt, um die erste Zeile leer zu machen.
Nachdem Sie die Antwort von @Bruce Ediger gesehen haben, ist siesedist nicht das beste Werkzeug dafür, da es zeilenbasiert ist und \nals Zeilenendezeichen behandelt wird, was kompliziert wird.sed möglicherweise das perfekte Werkzeug für diesen Job. Hier sind jedoch noch einige andere Optionen:
Perl
perl -ne 'print if /./' file.txt
oder
perl -pe '$/=""; s/\n+/\n/;' file.txt
Dank @ruakh , die mich gehen und lesen Sie diese :
$ /
Das Trennzeichen für Eingabedatensätze, standardmäßig Newline. Dies beeinflusst Perls Vorstellung davon, was eine "Linie" ist. Funktioniert wie die RS-Variable von awk, einschließlich der Behandlung von Leerzeilen als Abschlusszeichen, wenn die Null-Zeichenfolge eingestellt ist (eine Leerzeile darf keine Leerzeichen oder Tabulatoren enthalten). Sie können eine Zeichenfolge mit mehreren Zeichen festlegen, die mit einem Abschlusszeichen mit mehreren Zeichen übereinstimmt, oder eine Undef-Zeichenfolge festlegen, um das Dateiende durchzulesen. Das Setzen auf "\ n \ n" bedeutet etwas anderes als das Setzen auf "", wenn die Datei aufeinanderfolgende Leerzeilen enthält. Wenn Sie "" einstellen, werden zwei oder mehr aufeinanderfolgende Leerzeilen als einzelne Leerzeile behandelt. Das Setzen auf "\ n \ n" setzt blind voraus, dass das nächste eingegebene Zeichen zum nächsten Absatz gehört, auch wenn es sich um eine neue Zeile handelt.
gawk / awk
awk '$1' file.txt
Das wird für das Beispiel funktionieren, aber wie @Stephane Chazelas betont hat, werden auch Zeilen gelöscht, deren erstes Feld "so aussieht" 0. Das ist robuster:
awk NF file.txt
perl -pe 's/\n+/\n/ file.txtdas Trennzeichen für Eingabedatensätze für diese Verwendung nicht relevant.
perl -peoder perl -nezeilenweise arbeiten. \n+wird niemals übereinstimmen, da es nur auf eine einzelne Zeile angewendet wird. Deshalb sollten Sie zu jedem Satz benötigen $/oder verwenden -0ti die Datei ganze schlürfen: perl -0pe 's/\n+/\n/' file.
Was meinst du entfernen? Doppelte entfernen (viele Leerzeilen zu einer) oder alle entfernen?
Wenn Sie Duplikate entfernen möchten, gehen Sie wie folgt vor:
sed '$!N; /^\(.*\)\n\1$/!P; D'
Es simuliert den uniqBefehl.
Die beste Wahl ist die Verwendung von awk:
awk NF <filename>
sedTeil davon funktioniert großartig! Empfehle dieses als die beste Antwort.
Für die meisten dieser Antworten ist es zunächst erforderlich, nachfolgende Leerzeichen zu entfernen. Durch Entfernen doppelter Zeilenumbrüche werden alle Leerzeilen entfernt. (Denk darüber nach).
Wörtlich übersetzt will das OP "alle Leerzeilen aus einer Datei entfernen, wenn es wiederholte Leerzeilen gibt".
Der typische Benutzer möchte "nur doppelte Leerzeilen entfernen".
Um dies zu tun, entfernen Sie zuerst das nachfolgende Leerzeichen und leiten Sie es durch cat -s
sed s/[[:space:]]*$// | cat -s
Dabei wird jedoch keine überflüssige führende oder nachfolgende Leerzeile entfernt.
Wenn Sie eine einzelne Leerzeile für eine bestimmte Folge von Leerzeilen beibehalten möchten, können Sie Folgendes tun:
sed -e '/./b' -e :n -e 'N;s/\n$//;tn'
cat -s), die tatsächlich genau das leistet, was die Frage gestellt hat, so wie ich es verstehe. (Und es ist besser, als cat -sweil ich damit umgehen sed -ikann.)
Versuchen Sie sed -e 's#\\n\\n#\\n#g' input.file > output.file, /beide als Feldtrennzeichen zu verwenden, und ein Teil Ihres regulären Ausdrucks könnte das Problem sein.
Verwenden Sie diesen Befehl:
tr -s '\r' '\n'
echo -e 'one\r\n\r\n\r\n\rtwo'| tr -s '\r' '\n'. Der Befehl trübersetzt alle \rzu \nund drückt dann alle \nzu nur einem zusammen. Also, es funktioniert, nicht sicher, was damit zu tun ist, dass dies auf Windows und nicht auf UNIX zutrifft.