Jak usunąć puste / puste (tylko spacje) wiersze w pliku w systemie Unix / Linux za pomocą wiersza polecenia?
zawartość pliku.txt
Line:Text
1:<blank>
2:AAA
3:<blank>
4:BBB
5:<blank>
6:<space><space><space>CCC
7:<space><space>
8:DDD
pożądana wydajność
1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD
Odpowiedzi:
Ta linia sed powinna załatwić sprawę:
-i
Oznacza to edytować plik w miejscu.źródło
\s*
samego rozwiązania podano w pytaniu dotyczącymbad flag in substitute command: 'e'
grep
Prostym rozwiązaniem jest użycie polecenia
grep
( GNU lub BSD ) jak poniżej.Usuń puste linie (bez linii ze spacjami).
Usuń całkowicie puste linie (w tym linie ze spacjami).
Uwaga: jeśli otrzymasz niechciane kolory, oznacza to, że masz
grep
pseudonimgrep --color=auto
(sprawdź przeztype grep
). W takim przypadku możesz dodać--color=none
parametr lub po prostu uruchomić komendę jako\grep
(która ignoruje alias).ripgrep
Podobne z
ripgrep
(odpowiednie dla znacznie większych plików).Usuń puste linie bez linii ze spacjami:
lub włączając linie ze spacjami:
Zobacz też:
sed
: Usuń puste linie za pomocą sedawk
: Usuń puste linie za pomocą awkźródło
grep .
wydaje się być najprostszym rozwiązaniem.grep .
porównaniu z innymi rozwiązaniami jest to, że podświetli cały tekst na czerwono. Inne rozwiązania mogą zachować oryginalne kolory. Porównajunbuffer apt search foo | grep .
zunbuffer apt search foo | grep -v ^$
grep
jest aliasgrep --color=auto
(sprawdź przez :)type grep
. Możesz uruchomić go jako\grep
lub użyć--color=none
parametru.grep --color=none .
, dostaniesz cały biały tekst, który zasłania formatowanie kolorów oryginalnego polecenia (Przykład:apt search foo
)grep .
dopasuje wiersze zawierające tylko spacje, które według OP nie są pożądane.d to polecenie sed służące do usuwania wiersza.
^$
jest wyrażeniem regularnym pasującym tylko do pustej linii, początek linii i koniec linii.źródło
Możesz użyć opcji -v z grep, aby usunąć pasujące puste linie.
Lubię to
źródło
-E
, przynajmniej nie w przypadku GNU grep, ale poza tym jestem bardzo zadowolony z tego, że zrobiono to z grep! Za każdym razem sięgam po sed; filtry liniowe wydają mi się lepsze niż wbudowane edytory.grep -Ev '^#|^$' file.txt
Oto
awk
rozwiązanie:Z Awk
NF
ustawia się tylko na niepustych liniach. Gdy ten warunek się zgadza, domyślną akcją Awk jest wydrukowanie całej linii.źródło
Aby usunąć puste linie, możesz wycisnąć nowe powtórzenia linii za pomocą
tr
:źródło
xargs, jeśli nie masz nic przeciwko usuwaniu wiodących białych znaków
źródło
Ex / Vim
Oto metoda wykorzystująca
ex
edytor (część Vima):W przypadku wielu plików (edytuj na miejscu):
Uwaga:
:bufdo
Polecenie to nie POSIX .Bez modyfikacji pliku (wystarczy wydrukować na standardowym wyjściu):
źródło
Dla mnie polecenie @ martigin-heemels zgłaszało błąd, który to naprawił (tj. Fikcyjny parametr do i),
sed -i '' '/^$/d' file.txt
źródło
Prawdopodobnie najłatwiejszym sposobem usunięcia pustych linii (bez spacji) jest użycie
cat -s
:Przynajmniej jeśli nie chcesz edytować pliku w miejscu, ale na przykład napisz do terminala. Ponadto nie wiąże się to z żadnymi zabawnymi wyrażeniami regularnymi, więc jest bardzo łatwy do zapamiętania nawet dla osób, które nie są przyjazne dla RE.
Od
man cat
:-s, --squeeze-blank never more than one single blank line
Może być inny w różnych systemach operacyjnych, ale był obecny na kilku Linuxach i OpenBSD ostatnim razem, gdy sprawdzałem.
źródło