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


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.


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.


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


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”


To nie usuwa wierszy zawierających tylko spację i tabulator, zgodnie z konkretnymi żądaniami.
— dave_thompson_085



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ż:

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.