Usuń puste linie w pliku tekstowym za pomocą grep

84

FILE:

hello

world

foo

bar

Jak mogę usunąć wszystkie puste nowe wiersze z tego FILE?

Wyjście polecenia:

FILE:

hello
world
foo
bar
user191960
źródło
1
Możliwy duplikat Usuń puste wiersze za pomocą SED
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

132

grep . FILE


(A jeśli naprawdę chcesz to zrobić w sed, a następnie: sed -e /^$/d FILE)

(A jeśli naprawdę chcesz to zrobić w awk, a następnie: awk /./ FILE)

DigitalRoss
źródło
1
Słodkie! TY również dla innych poleceń - ale wygląda na to, że grep jest moim nowym najlepszym przyjacielem.
user191960
grep. FILE nie działa dla mnie. Prawdopodobnie lepiej jest trzymać się grepa do wyszukiwania zawartości plików i seda do edycji zawartości plików.
Michael Dillon,
7
sed -ne/./pdziała również i awk /./jest krótszy (akcja jest {print}nieokreślona). @ ghostdog74: grep '[^[:space:]]'wtedy.
ephemient
5
Dla tych, którzy nie rozumieją, .jest to wyrażenie regularne, które pasuje do dowolnego znaku poza znakiem nowej linii.
wisbucky
3
grep . FILEdziała z podanym przykładem, ale niekoniecznie, gdy plik może mieć bajty, które nie są częścią zestawu znaków. Na przykład w przypadku GNU grep 2.20 printf "\x80\n" | grep .nic nie wyświetla.
vinc17
37

Spróbuj wykonać następujące czynności:

grep -v -e '^$'
Panie Ree
źródło
ma to taki sam efekt jak grep. FILE w ten sposób, że zostanie pobrana spacja jako pusta linia.
ghostdog74
1
„grep” szuka dowolnej linii pasującej do wzorca. „.” pasuje do dowolnego znaku. „grep. FILE” odpowiada dowolnej linii zawierającej co najmniej 1 znak. Natomiast „grep -v” wyklucza wiersze pasujące do wzorca. OP powiedział „usuń wszystkie puste nowe wiersze”. Jeśli chcesz wykluczyć wiersze zawierające tylko spacje, użyj polecenia „grep -v '^ $'”. Znak „ ” dopasuje zero lub więcej poprzedniego wzorca, w tym przypadku spację. Chociaż może wolisz dopasować i wykluczyć również inne białe znaki (tabulatory, kanały informacyjne itp.).
Pan Ree
3
Ta metoda pozwoliła mi na łatwiejsze łączenie wielu wykluczeń niż tylko „grep. PLIK”. Na przykład patrzyłem na plik konfiguracyjny i chciałem wykluczyć wszystkie skomentowane wiersze i wszystkie puste wiersze. Więc użyłem "grep -v -e '#' -e '^ $' squid.conf". Udało się.
Ben K
2
ten jest dużo szybszy niż „grep. PLIK'. Wynika to z bardziej złożonych zadań weryfikacji wyrażenia regularnego „”. niż wykluczanie, gdy tylko ^ $ nie pasuje.
Édouard Lopez,
2
grep -v -e '^$'zawsze działa, co nie ma miejsca grep .. Na przykład w przypadku GNU grep 2.20 printf "\x80\n" | grep .nic nie wyświetla, natomiast printf "\x80\n" | grep -v '^$'wyświetla niepustą linię.
vinc17
11
with awk, just check for number of fields. no need regex

$ more file
hello

world

foo

bar

$ awk 'NF' file
hello
world
foo
bar
ghostdog74
źródło
Nie potrzebuje cytatów. Ta sztuczka znajduje się w awk1line.txt- z drugiej strony, podobnie jak większość sztuczek awk :)
ephemient
2
to po prostu moja dobra praktyka umieszczanie cudzysłowów, ponieważ uruchamiasz go z powłoki .. w przypadku złożonych instrukcji awk nadal musisz umieszczać cudzysłowy. dlaczego więc nie kultywować tego nawyku.
ghostdog74
wyjaśnienie, jak to działa: stackoverflow.com/questions/23544804/…
wisbucky
9

Oto rozwiązanie, które usuwa wszystkie linie, które są puste lub zawierają tylko znaki spacji:

grep -v '^[[:space:]]*$' foo.txt
Marco Coutinho
źródło
2

Spróbuj tego: sed -i '/^[ \t]*$/d' file-name

Spowoduje to usunięcie wszystkich pustych linii, które mają nie. odstępów (spacji lub tabulatorów), tj. (0 lub więcej) w pliku.

Uwaga: w nawiasie kwadratowym znajduje się „spacja”, po której następuje „\ t”.

Modyfikator -iwymusi zapisanie zaktualizowanej zawartości z powrotem w pliku. Bez tej flagi możesz zobaczyć, że puste linie zostały usunięte na ekranie, ale nie będzie to miało wpływu na rzeczywisty plik.

Prabhat Kumar Singh
źródło
1

grep '^..' my_file

przykład

THIS

IS

THE

FILE

EOF_MYFILE

jako wyjście podaje tylko wiersze z przynajmniej 2 znakami.

THIS
IS
THE
FILE
EOF_MYFILE

Zobacz także wyniki z grep '^' my_fileproduktami

THIS

IS

THE

FILE

EOF_MYFILE

a także z grep '^.' my_filewyjściami

THIS
IS
THE
FILE
EOF_MYFILE
clblue2000
źródło
1

Jeśli usunięcie pustych linii oznacza linie zawierające spacje, użyj:

grep '\S' FILE

Na przykład:

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

line2

line3

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

line3

line4

Zobacz też:

kenorb
źródło
0

Wypróbuj ex -way:

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

W przypadku wielu plików (edycja lokalna):

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

Bez modyfikowania pliku (po prostu wydrukuj na standardowym wyjściu):

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

Perl może być przesadą, ale działa równie dobrze.

Usuwa wszystkie wiersze, które są całkowicie puste:

perl -ne 'print if /./' file

Usuwa wszystkie linie, które są całkowicie puste lub zawierają tylko spacje:

perl -ne 'print if ! /^\s*$/' file

Odmiana, która edytuje oryginał i tworzy plik .bak:

perl -i.bak -ne 'print if ! /^\s*$/' file
Chris Koknat
źródło
0

Jeśli chcesz wiedzieć, jaka jest całkowita liczba wierszy kodu w twoim projekcie Xcode i nie jesteś zainteresowany wyświetlaniem liczby dla każdego pliku Swift, to da ci odpowiedź. Usuwa wiersze bez kodu i usuwa wiersze poprzedzone komentarzem//

Uruchom go na poziomie głównym projektu Xcode.

find . \( -iname \*.swift \) -exec grep -v '^[[:space:]]*$' \+ | grep -v -e '//' | wc -l

Jeśli masz w kodzie bloki komentarzy zaczynające się /*i kończące */na:

/*
 This is an comment block 
*/

wtedy te zostaną uwzględnione w liczbie. (Zbyt trudne).

Chrispy
źródło
0

Najprostsza odpowiedź -----------------------------------------

[root@node1 ~]# cat /etc/sudoers | grep -v -e ^# -e ^$
Defaults   !visiblepw
Defaults    always_set_home
Defaults    match_group_by_gid
Defaults    always_query_group_plugin
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root    ALL=(ALL)       ALL
%wheel  ALL=(ALL)       ALL
[root@node1 ~]#
Deepak Shinde
źródło