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.