Jak usunąć puste / puste wiersze z pliku w systemie Unix (w tym spacje)?

60

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
Michael Ellick Ang
źródło
1
To epicka odpowiedź, która prawie daje wszystkie możliwe rozwiązania za pomocą grep, sed, awk: stackoverflow.com/questions/16414410/…
wisbucky

Odpowiedzi:

86

Ta linia sed powinna załatwić sprawę:

sed -i '/^$/d' file.txt

-iOznacza to edytować plik w miejscu.

Martijn Heemels
źródło
13
W rzeczywistości musi być „/ ^ * $ / d”, aby usunąć wiersze zawierające tylko spacje.
Sean Reifschneider
2
@SeanReifschneider Wymóg ten nie był kwestionowany, kiedy napisano tę odpowiedź?
kasperd 18.04.16
4
@SeanReifschneider Czy „/ ^ \ s * $ / d” nie byłoby lepsze, ponieważ zawierałoby tabulatory? Chociaż nie jest wspomniany w oryginalnym poście, wydaje mi się, że jest to silniejsza opcja.
mrswadge,
Dostajębad flag in substitute command: 'e'
ishandutta2007
29

grep

Prostym rozwiązaniem jest użycie polecenia grep( GNU lub BSD ) jak poniżej.

  • Usuń puste linie (bez linii ze spacjami).

    grep . file.txt
    
  • Usuń całkowicie puste linie (w tym linie ze spacjami).

    grep "\S" file.txt
    

Uwaga: jeśli otrzymasz niechciane kolory, oznacza to, że masz greppseudonim grep --color=auto(sprawdź przez type grep). W takim przypadku możesz dodać --color=noneparametr 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:

rg -N . file.txt

lub włączając linie ze spacjami:

rg -N "\S" file.txt

Zobacz też:

kenorb
źródło
2
grep .wydaje się być najprostszym rozwiązaniem.
Leo
Minusem w 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ównaj unbuffer apt search foo | grep .zunbuffer apt search foo | grep -v ^$
wisbucky
1
@wisbucky Widzisz kolory, ponieważ w twoim systemie grepjest alias grep --color=auto(sprawdź przez :) type grep. Możesz uruchomić go jako \greplub użyć --color=noneparametru.
kenorb
@kenorb Jeśli używasz grep --color=none ., dostaniesz cały biały tekst, który zasłania formatowanie kolorów oryginalnego polecenia (Przykład: apt search foo)
wisbucky
grep .dopasuje wiersze zawierające tylko spacje, które według OP nie są pożądane.
Jim L.
27
sed '/^$/d' file.txt

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.

Kamil Kisiel
źródło
+1 za wyjaśnienie
Alex Raj Kaliamoorthy
To polecenie nie daje takiego samego wyniku, jak żądane OP (tworzy 5 wierszy, a nie 4).
kenorb
22

Możesz użyć opcji -v z grep, aby usunąć pasujące puste linie.

Lubię to

grep -Ev "^$" file.txt
jdabney
źródło
4
Nie sądzę, żebyś potrzebował -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.
MadHatter
Jeśli chcesz pominąć skomentowane i puste wiersze, szczególnie podczas pracy z plikami confgrep -Ev '^#|^$' file.txt
Govind Kailas
7

Oto awkrozwiązanie:

awk NF file.txt

Z Awk NFustawia się tylko na niepustych liniach. Gdy ten warunek się zgadza, domyślną akcją Awk jest wydrukowanie całej linii.

Steven Penny
źródło
6

Aby usunąć puste linie, możesz wycisnąć nowe powtórzenia linii za pomocą tr:

cat file.txt | tr -s '\n' '\n'
Siddhadev
źródło
Daje to 6 linii, a nie 4 zgodnie z żądaniem OP.
kenorb
1

xargs, jeśli nie masz nic przeciwko usuwaniu wiodących białych znaków

$ docker run -it --rm alpine sh
/ # cat <<eof > /tmp/file
> one
>
>   two
> three
>
>
>   four
> eof
/ # cat /tmp/file
one

  two
three


  four
/ # cat /tmp/file | xargs -n1
one
two
three
four
Christian Calloway
źródło
0

Ex / Vim

Oto metoda wykorzystująca exedytor (część Vima):

ex -s +'v/\S/d' -cwq test.txt

W przypadku wielu plików (edytuj na miejscu):

ex -s +'bufdo!v/\S/d' -cxa *.txt

Uwaga: :bufdoPolecenie to nie POSIX .

Bez modyfikacji pliku (wystarczy wydrukować na standardowym wyjściu):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin
kenorb
źródło
0

Dla mnie polecenie @ martigin-heemels zgłaszało błąd, który to naprawił (tj. Fikcyjny parametr do i),

sed -i '' '/^$/d' file.txt

ishandutta2007
źródło
0

Prawdopodobnie najłatwiejszym sposobem usunięcia pustych linii (bez spacji) jest użycie cat -s:

$ cat -s file
$ some-command | 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.

kyrill
źródło