grep -v '^$'
Linux'ta denedim ve bu işe yaramadı. Bu dosya bir Windows dosya sisteminden geldi.
grep -v '^$'
Linux'ta denedim ve bu işe yaramadı. Bu dosya bir Windows dosya sisteminden geldi.
Yanıtlar:
Takip etmeyi dene:
grep -v -e '^$' foo.txt
Bu -e
seçenek, eşleme için normal ifade modellerine izin verir.
Etraftaki tek alıntılar ^$
onu Cshell için çalıştırır. Diğer mermiler tek veya çift tırnaktan memnun olacaktır.
GÜNCELLEME: Bu benim için boş satırları veya "tüm beyaz alanı" ("\ r \ n" stil satır sonları olan pencereler gibi) bir dosya için çalışır, oysa yukarıdakiler sadece boş satırları ve unix tarzı satır sonları olan dosyaları kaldırır:
grep -v -e '^[[:space:]]*$' foo.txt
grep -E -v
, sonraki her şey -e
desen olarak yorumlanmalıdır.
grep -v -e '^[[:space:]]*$' -e '^#' file
bir komut dosyasında veya yapılandırma dosyasında (veya yorumlar için karma karakterini kullanan herhangi bir dosya türünde) boş olmayan, yorum yapmayan tüm satırları verir.
-e
Seçenek eşleme için normal ifade kalıplarına izin verir." Bu çok yanıltıcı . -e
: This can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-).
( kılavuzdan ) için (POSIX-) bir tanımdır . Grep zaten varsayılan olarak (temel) bir normal ifade bekliyor. Bu modeli için, dışarı bırakabilir -e
tamamen: grep -v '^[[:space:]]*$' foo.txt
.
Basit tutun.
grep . filename.txt
kullanın:
$ dos2unix file
$ grep -v "^$" file
Veya sadece awk:
awk 'NF' file
Dos2unix'iniz yoksa, tr gibi araçlar kullanabilirsiniz :
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
Kodu çalıştırma
$ echo "
> hello
>
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok
Bunun nasıl / neden çalıştığı hakkında daha fazla bilgi edinmek için düzenli ifadeleri okumanızı tavsiye ederim. http://www.regular-expressions.info/tutorial.html
Kullanmayı tercih ederim egrep
, testimde boş bir çizgi ile orijinal bir dosya ile yaklaşımınız iyi çalıştı (testimde tırnak işaretleri olmasa da). Bu da işe yaradı:
egrep -v "^(\r?\n)?$" filename.txt
Bir satırda birden fazla boş satır diziniz varsa ve her sekans için yalnızca bir boş satır istiyorsanız, deneyin
grep -v "unwantedThing" foo.txt | cat -s
cat -s
tekrarlanan boş çıkış hatlarını bastırır.
Çıktınız
match1
match2
için
match1
match2
Orijinal çıktıdaki üç boş satır, bir boş satıra sıkıştırılır veya "sıkıştırılır".
Önceki cevaplarla aynı:
grep -v -e '^$' foo.txt
Burada, grep'ingrep -e
genişletilmiş versiyonu anlamına gelir . '^ $', ^ (Satır başı) ile $ (satır sonu) arasında herhangi bir karakter olmadığı anlamına gelir. '^' ve '$' normal ifade karakterleridir.
Böylece komut grep -v
, bu kalıpla eşleşmeyen tüm satırları yazdırır (^ ile $ arasında karakter yok).
Bu şekilde boş boş satırlar ortadan kaldırılır.
-e
"grep genişletilmiş sürümü" anlamına gelmez, belki kafanız karıştı -E
? Kılavuz açıkça -e
bir kalıbın takip ettiğini açıkça söylüyor. Desen bir tire işareti ile başlamadığından ve yine de yalnızca bir desen tanımladığınızdan, varsayılan olarak grep'in bir normal ifade deseni beklediği için dışarıda bırakabilirsiniz: grep -v '^$' foo.txt
(genişletilmiş normal ifade işlevine gerek yoktur). Ayrıca, bunun dosyadaki boş satırları ortadan kaldırmadığını, yalnızca çıktıdan geçirilenleri ortadan kaldırdığını belirtmek gerekir. Bu durumda, sed -i
doğru araç olurdu.
Çok denedim, ama bu işe yarıyor gibi görünüyor (varsayalım \r
burada ısırıyor):
printf "\r" | egrep -xv "[[:space:]]*"
Perl Kullanımı:
perl -ne 'print if /\S/'
\S
boş olmayan karakterlerle eşleşmek anlamına gelir.
egrep -v "^ \ s \ s +"
egrep zaten normal ifade yapıyor ve \ s beyaz boşluk.
+ Geçerli kalıbı çoğaltır.
^ Başlangıç içindir
kullanın:
grep pattern filename.txt | uniq
uniq
bitişik boş satırları yalnızca bir boş satıra indirir, ancak tamamen kaldırmaz. Yine de böyle kullanmayı denemeyi uniq
seviyorum. İlk sıralama, tüm boş satırları etkili bir şekilde kaldıracaktır - yalnızca bir tane bırakılır, ancak satır sırasını yeniden düzenlemek kabul edilemeyebilir.
İşaretle başlayan beyaz çizgileri ve çizgileri kaldırmanın başka bir yolu #
. Bunun yapılandırma dosyalarını okumak için oldukça yararlı olduğunu düşünüyorum.
[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
Grep -v -e '^ $' kullanımının çalışabileceği doğrudur , ancak içinde 1 veya daha fazla boşluk olan boş satırları kaldırmaz . Boş satırları kaldırmak için en kolay ve en basit cevabı awk kullanmak buldum . Aşağıdaki yukarıdaki awk adamlardan biraz değiştirilmiş:
awk 'NF' foo.txt
Ama bu soru grep kullanmak için olduğu için aşağıdakilere cevap vereceğim:
grep -v '^ *$' foo.txt
Not : ^ ve * arasındaki boşluk.
Veya \ s kullanarak aşağıdaki gibi boş alanı temsil edebilirsiniz:
grep -v '^\s*$' foo.txt