Frage sagt mehr oder weniger alles. Mir ist bekannt, dass /^$/d
alle Leerzeilen entfernt werden, aber ich kann nicht sagen, wie zwei oder mehr Leerzeilen durch eine einzelne Leerzeile ersetzt werden sollen.
Irgendwelche Ideen?
quelle
Frage sagt mehr oder weniger alles. Mir ist bekannt, dass /^$/d
alle Leerzeilen entfernt werden, aber ich kann nicht sagen, wie zwei oder mehr Leerzeilen durch eine einzelne Leerzeile ersetzt werden sollen.
Irgendwelche Ideen?
Wenn Sie nicht für eine andere Verwendung vim oder sed feuern, hat cat tatsächlich eine einfache Möglichkeit, mehrere Leerzeilen zu kollabieren cat -s
. Verwenden Sie einfach .
Wenn Sie bereits in vim waren und dort bleiben :%s!\n\n\n\+!^M^M!g
möchten, können Sie dies mit dem internen Suchen und Ersetzen tun, indem Sie Folgendes eingeben : (Das ^ M ist die visuelle Darstellung einer neuen Zeile. Sie können es eingeben, indem Sie Ctrl+ drücken. vEnter) Oder speichern Sie sich das Eingabe von nur Katze Beschuss aus: :%!cat -s
.
-s
Option cat nicht - nur eine historische Anmerkung, sie ist nicht in POSIX enthalten, scheint aber in BSD und GNU cat verfügbar zu sein.:%!cat -s
. Lerne jeden Tag etwas Neues!%s!\n\n\n\+!\r\r!g
Verwenden Sie
\n
diese Option, um eine neue Zeile im Suchmuster anzugeben. Verwenden Sie Ctrl+ Mim Ersetzungstext oder einen Rückverweis. Siehe:help pattern
und:help sub-replace-special
(verlinkt von:help :s
).quelle
\n
das im Ersetzungstext nicht funktioniert.Wenn Sie in Vim sind, machen Sie einfach Folgendes:
quelle
man
Seite handelt.Perl benutzen:
-00
Die Befehlszeilenoption aktiviert den Slurp-Modus für Absätze, was bedeutet, dass Perl Text Absatz für Absatz und nicht Zeile für Zeile liest.quelle
Mit sed (GNU sed) 4.2.2:
quelle
Ich weiß, dass dies alberner Code ist, aber ich wollte dieses Problem in weniger als 10 Minuten lösen, und es hat funktioniert
quelle
uniq
Entfernt benachbarte gleiche Linien. Welches ist nicht das, was OP will.