Próbowałem grep -v '^$'
w Linuksie i to nie zadziałało. Ten plik pochodzi z systemu plików Windows.
164
Spróbuj wykonać następujące czynności:
grep -v -e '^$' foo.txt
Ta -e
opcja umożliwia dopasowywanie wzorców wyrażeń regularnych.
Pojedyncze cudzysłowy ^$
sprawiają, że działa to w Cshell. Inne powłoki będą zadowolone z cudzysłowów pojedynczych lub podwójnych.
AKTUALIZACJA: Działa to dla mnie dla pliku z pustymi liniami lub „wszystkimi białymi znakami” (takimi jak linie okien z końcówkami linii w stylu „\ r \ n”), podczas gdy powyższe usuwa tylko pliki z pustymi liniami i końcówkami linii w stylu unixowym:
grep -v -e '^[[:space:]]*$' foo.txt
grep -E -v
, wszystko później-e
jest interpretowane jako wzorzec.grep -v -e '^[[:space:]]*$' -e '^#' file
wyświetli wszystkie niepuste, nie będące komentarzami wiersze w skrypcie lub pliku konfiguracyjnym (lub dowolnym typie pliku, który używa znaku krzyżyka dla komentarzy).-e
opcja umożliwia dopasowywanie wzorców regex”. To jest bardzo mylące .-e
jest (POSIX-) definicją dla:This can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-).
(z podręcznika ). Grep już domyślnie oczekuje (podstawowego) wyrażenia regularnego. Z tego wzoru, można pominąć-e
w całości:grep -v '^[[:space:]]*$' foo.txt
.Nie komplikuj.
źródło
Posługiwać się:
Lub po prostu awk:
Jeśli nie masz dos2unix, możesz użyć narzędzi takich jak tr :
źródło
awk
.Uruchamianie kodu
Aby dowiedzieć się więcej o tym, jak / dlaczego to działa, polecam przeczytanie o wyrażeniach regularnych. http://www.regular-expressions.info/tutorial.html
źródło
Wolę używać
egrep
, chociaż w moim teście z oryginalnym plikiem z pustą linią twoje podejście działało dobrze (choć bez cudzysłowów w moim teście). To też zadziałało:źródło
Jeśli masz sekwencje wielu pustych wierszy w jednym rzędzie i chciałbyś mieć tylko jeden pusty wiersz na sekwencję, spróbuj
cat -s
pomija powtarzające się puste wiersze wyjściowe.Twój wynik będzie pochodził z
do
Trzy puste wiersze w oryginalnym wyniku byłyby skompresowane lub „ściśnięte” w jeden pusty wiersz.
źródło
źródło
To samo co poprzednie odpowiedzi:
Tutaj
grep -e
oznacza rozszerzoną wersję grep . „^ $” oznacza, że nie ma żadnego znaku między ^ (początek wiersza) a $ (koniec wiersza). „^” i „$” to znaki wyrażenia regularnego.Zatem polecenie
grep -v
wypisze wszystkie wiersze, które nie pasują do tego wzorca (brak znaków między ^ a $).W ten sposób puste puste linie są eliminowane.
źródło
-e
nie oznacza "rozszerzonej wersji grepa", może jesteś zdezorientowany-E
? Podręcznik wyraźnie mówi, że-e
po prostu wyraźnie mówi, że następuje wzór. Ponieważ wzorzec nie zaczyna się od myślnika, a i tak definiujesz tylko jeden wzorzec, równie dobrze możesz go pominąć, ponieważ domyślnie grep oczekuje jednego wzorca wyrażenia regularnego:grep -v '^$' foo.txt
(nie ma potrzeby korzystania z rozszerzonej funkcjonalności wyrażenia regularnego). Warto również wspomnieć, że nie eliminuje to pustych wierszy w pliku, a jedynie te, które są przesyłane potokiem przez wyjście. W takim przypadkused -i
byłoby właściwym narzędziem.Bardzo się starałem, ale to wydaje się działać (zakładając, że
\r
cię tu gryzie):źródło
Korzystanie z Perla:
\S
oznacza dopasowywanie niepustych znaków.źródło
egrep -v "^ \ s \ s +"
egrep już wykonuje regex, a \ s to biały znak.
Znak + powiela bieżący wzorzec.
^ Jest na początek
źródło
Posługiwać się:
źródło
uniq
zredukuje przylegające puste linie do jednej pustej linii, ale nie usuwa ich całkowicie. Mimo to lubię próbować tego używaćuniq
. Sortowanie w pierwszej kolejności skutecznie usunie wszystkie puste wiersze - pozostawiając tylko jeden, ale zmiana kolejności wierszy może być nie do przyjęcia.Oto inny sposób na usunięcie białych linii i linii zaczynających się od
#
znaku. Myślę, że jest to przydatne do czytania plików konfiguracyjnych.źródło
Prawdą jest, że użycie grep -v -e '^ $' może działać, jednak nie usuwa pustych wierszy, które mają 1 lub więcej spacji . Odkryłem, że najłatwiejszą i najprostszą odpowiedzią na usuwanie pustych linii jest użycie awk . Poniższy fragment jest nieco zmodyfikowany w stosunku do facetów z awk powyżej:
Ale ponieważ to pytanie dotyczy używania grep, odpowiem na następujące pytanie:
Uwaga : spacja między ^ i *.
Lub możesz użyć \ s do oznaczenia pustej przestrzeni w następujący sposób:
źródło