Próbowałem grep -v '^$'
w Linuksie i to nie zadziałało. Ten plik pochodzi z systemu plików Windows.
Próbowałem grep -v '^$'
w Linuksie i to nie zadziałało. Ten plik pochodzi z systemu plików Windows.
Odpowiedzi:
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.
grep . filename.txt
Posługiwać się:
$ dos2unix file
$ grep -v "^$" file
Lub po prostu awk:
awk 'NF' file
Jeśli nie masz dos2unix, możesz użyć narzędzi takich jak tr :
tr -d '\r' < "$file" > t ; mv t "$file"
awk
.
grep -v "^[[:space:]]*$"
The -v makes it print lines that do not completely match
===Each part explained===
^ match start of line
[[:space:]] match whitespace- spaces, tabs, carriage returns, etc.
* previous match (whitespace) may exist from 0 to infinite times
$ match end of line
Uruchamianie kodu
$ echo "
> hello
>
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok
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
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:
egrep -v "^(\r?\n)?$" filename.txt
Jeśli masz sekwencje wielu pustych wierszy w jednym rzędzie i chciałbyś mieć tylko jeden pusty wiersz na sekwencję, spróbuj
grep -v "unwantedThing" foo.txt | cat -s
cat -s
pomija powtarzające się puste wiersze wyjściowe.
Twój wynik będzie pochodził z
match1
match2
do
match1
match2
Trzy puste wiersze w oryginalnym wyniku byłyby skompresowane lub „ściśnięte” w jeden pusty wiersz.
To samo co poprzednie odpowiedzi:
grep -v -e '^$' foo.txt
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.
-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 przypadku sed -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):
printf "\r" | egrep -xv "[[:space:]]*"
Korzystanie z Perla:
perl -ne 'print if /\S/'
\S
oznacza dopasowywanie niepustych znaków.
egrep -v "^ \ s \ s +"
egrep już wykonuje regex, a \ s to biały znak.
Znak + powiela bieżący wzorzec.
^ Jest na początek
Posługiwać się:
grep pattern filename.txt | uniq
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.
[root@localhost ~]# cat /etc/sudoers | egrep -v '^(#|$)'
Defaults requiretty
Defaults !visiblepw
Defaults always_set_home
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
LS_COLORS"
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
stack ALL=(ALL) NOPASSWD: ALL
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:
awk 'NF' foo.txt
Ale ponieważ to pytanie dotyczy używania grep, odpowiem na następujące pytanie:
grep -v '^ *$' foo.txt
Uwaga : spacja między ^ i *.
Lub możesz użyć \ s do oznaczenia pustej przestrzeni w następujący sposób:
grep -v '^\s*$' foo.txt