Jak usunąć puste wiersze z pliku (w tym tabulator i spacje)?

23

Chcę usunąć wszystkie puste linie z pliku. Nawet jeśli linia zawiera spacje lub tabulatory, należy ją również usunąć.

Użytkownik Jamshed Ansari3000272
źródło

Odpowiedzi:

26

Tylko grepdla niepustych:

grep '[^[:blank:]]' < file.in > file.out

[:blank:], wewnątrz zakresów znaków ( [...]), nazywa się klasą znaków POSIX. Jest kilka takich [:alpha:], jak [:digit:]... [:blank:]dopasowuje białą spację w poziomie (w ustawieniach POSIX, to jest spacja i tabulator, ale w innych lokalizacjach może być więcej, jak wszystkie znaki odstępów w poziomie Unicode w ustawieniach UTF8), podczas gdy [[:space:]]dopasowuje poziome i pionowe białe znaki spacji (takie same jak znaki [:blank:]plus, takie jak tabulacja pionowa, wysuw strony ...)

grep '[:blank:]'

Wrócą linie, które zawierają wszelkie znaki, :, b, l, a, nlub k. Klasy postaci są rozpoznawane tylko w zestawie [...]i ^wewnątrz [...]neguje zestaw. Więc [^[:blank:]]oznacza dowolny znak, ale te puste.

Stéphane Chazelas
źródło
1
czy powinien istnieć również $koniec linii?
Michael Durrant
@MichaelDurrant Nie jest zakotwiczony po żadnej ze stron
Jordan
1
@MichaelDurrant. [^[:blank:]]$dopasowuje tylko linie kończące się niepustym. Chcemy, aby wiersze zawierały niepuste miejsca w dowolnym miejscu
Stéphane Chazelas,
@StephaneChazelas Próbowałem grep [: blank:] SOURCEFILE nawet to polecenie działa. Rozumiem, że [] dotyczy klasy postaci. Czy możesz mi powiedzieć, jak to działa? fragment: puste: jest dla mnie nowy.
Jamshed Ansari user3000272
Czy są jakieś przypadki, w których grep -E '\S'nie działałoby?
terdon
21

Oto awkrozwiązanie:

$ awk NF file

Z awk, NFustawiane tylko na niepustych liniach. Gdy ten warunek się zgadza, awkdomyślna czynność printspowoduje wydrukowanie całej linii.

Cuonglm
źródło
Zgrabne, usuwa również linie z białymi odstępami.
wisbucky
7

Co powiesz na:

sed -e 's/^[[:blank:]]*$//' source_file > newfile

lub

sed -e '/^[[:blank:]]*$/d' source_file > newfile

to znaczy

Dla każdej linii zamień:

  • jeśli się zacznie („ ^”)
  • ze spacjami lub tabulatorami („ [[:blank:]]”) zero lub więcej razy („ *”)
  • a następnie koniec linii („ $”)

Więcej informacji na temat :: blank :: i innych znaków specjalnych na stronie http://www.zytrax.com/tech/web/regex.htm#special

Michael Durrant
źródło
4
[[:space:]]zawiera zakładki. Jeśli tak się nie stanie, wyrażenie regularne zawiedzie, jeśli spacja będzie następować po karcie.
Jordan
Strony wctype(3)i isalpha(3)opisują, jakie klasy znaków będą pasować.
Jordan
Możesz usunąć pierwszy, który nie odpowiada na pytanie.
Stéphane Chazelas
@MichaelDurrant, czy możesz napisać coś o [[: blank:]]?
Jamshed Ansari user3000272
Dodano informacje o [[: blank ::]]. Stephane, dlaczego pierwszy nie działa? Myślałem, że // na końcu zastąpi linię bez niczego.
Michael Durrant
4

Możesz użyć sedpolecenia do usunięcia pustych linii:

sed '/^$/d' in > out

To polecenie usuwa wszystkie puste wiersze z pliku „w”

Raghavendra
źródło
To nie usuwa wierszy zawierających tylko spację i tabulator, zgodnie z konkretnymi żądaniami.
dave_thompson_085
3

Wygląda na to, że znalazłem taki nie tak szybki, ale w końcu zabawny:

| xargs -L1

poige
źródło
1
Fajny, krótki, ale robi więcej: usuwa również spacje i tabulatory.
jringoot
Och, okazało się, że jest jeszcze bardziej zdolny? - Miły! ;-P
poige
1
I obcina linie (domyślnie 1024 znaki) Zobacz strony: linux.die.net/man/1/xargs
jringoot
Głęboko
0

Wypróbuj ex -way:

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
uwaga bufdo nie jest POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
Steven Penny
0

Użyj następującego polecenia:

grep '\S' FILE

który usuwa wszystkie wiersze, w tym spacje lub tabulatory.

W przeciwnym razie, nie uwzględniając linii ze spacjami / tabulatorami, użyj:

grep . FILE

Na przykład:

$  printf "line1\n\nline2\n \nline3\n" > FILE
$  cat -v FILE
line1

line2

line3
$  grep '\S' FILE
line1
line2
line3
$  grep . FILE
line1
line2

line3

Zobacz też:

kenorb
źródło