Mam kilka plików tekstowych, których używam do robienia notatek - po prostu zwykły tekst, zwykle tylko za pomocą cat >> file
. Czasami używam pustej linii lub dwóch (po prostu return - znak nowej linii), aby określić nowy temat / linię myśli. Na koniec każdej sesji, przed zamknięciem pliku za pomocą Ctrl+ D, zwykle dodam wiele (5-10) pustych wierszy (klawisz powrotu), aby oddzielić sesje.
Nie jest to oczywiście zbyt sprytne, ale do tego celu działa. I mają jednak kończą się z dużą i mnóstwo niepotrzebnych pustych wierszy, więc szukam sposobu, aby usunąć (większość) dodatkowe linie. Czy istnieje polecenie dla systemu Linux (wytnij, wklej, grep, ...?), Którego można użyć bezpośrednio z kilkoma opcjami? Alternatywnie, czy ktoś ma pomysł na sed, awk lub perl (dobrze w jakimkolwiek języku skryptowym, choć wolałbym sed lub awk) skrypt, który zrobiłby to, czego chcę? Pisanie czegoś w C ++ (co właściwie mógłbym zrobić sam), wydaje się po prostu przesadą.
Przypadek 1: Potrzebuję skryptu / polecenia, które usunie więcej niż dwie (3 lub więcej) kolejnych pustych linii i zastąpi je tylko dwiema pustymi liniami. Chociaż byłoby dobrze, gdyby można go również dostosować, aby usunąć więcej niż jedną linię (2 lub więcej) i / lub zastąpić wiele pustych linii tylko jedną pustą linią.
Przypadek nr 2: Mógłbym również użyć skryptu / polecenia, które usuną pojedynczą pustą linię między dwoma liniami tekstu, ale pozostawią wiele pustych linii bez zmian (chociaż usunięcie jednej z pustych linii byłoby również dopuszczalne).
vim
jednym i miało zastąpić puste linie jednym pustym wierszem).Odpowiedzi:
Przypadek 1:
Przypadek 2:
źródło
Możesz użyć,
uniq
aby zwinąć wiele wystąpień pustych linii w jedną pustą linię, ale zwinie również linie zawierające tekst, jeśli są takie same i znajdują się pod sobą.źródło
Przypadek 1:
Przypadek 2:
źródło
Możesz rozwiązać przypadek nr 1 w ten sposób za pomocą GNU sed:
Oznacza to, że zbierz puste linie w obszarze wzorów, a jeśli jest więcej niż trzy lub więcej linii, zmniejsz ją do dwóch linii.
Aby połączyć linie z pojedynczymi odstępami, jak w przypadku 2, możesz to zrobić w następujący sposób:
Lub w formie komentarza:
źródło
To rozwiązanie zajmuje się również ostatnimi pustymi wierszami w pliku:
źródło
Zgodnie z sugestią Anthon , aby użyć „uniq” ...
Usuń wiodące, końcowe i zduplikowane puste linie.
W jednej długiej linii:
Lub po prostu użyj „cat -s”.
Zmieniłem nawias klamrowy na nawiasy klamrowe, aby pozostać w bieżącym kontekście powłoki, który, jak zakładam, jest bardziej wydajny. Zauważ, że nawiasy klamrowe wymagają średnika po ostatnim poleceniu i potrzebują miejsca na separację.
W jednym wierszu.
źródło
Opublikowane rozwiązania wyglądały dla mnie trochę tajemniczo. Oto rozwiązanie w Pythonie 3.6:
Możesz wywoływać funkcje z interpretera lub uruchamiać je z powłoki, np .:
źródło