Boş satırları grep ile kaldırın


Yanıtlar:


300

Takip etmeyi dene:

grep -v -e '^$' foo.txt

Bu -eseç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

Bu egrep, yalnızca sıfır veya 1 boşluğa sahip dosyalar için çalışır, 2 veya daha fazla boşluğa sahip dosyalar için çalışmaz. Değişiklik ? ile * arasındadır.
Ed Morton

4
Bu grep -E -v, sonraki her şey -edesen olarak yorumlanmalıdır.
jazzpi

6
grep -v -e '^[[:space:]]*$' -e '^#' filebir 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.
palswim

" -eSeç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 -etamamen: grep -v '^[[:space:]]*$' foo.txt.
Yeti

73

Basit tutun.

grep . filename.txt

1
bu bana dosyadaki tüm satırları veriyor
phuclv

2
@ LưuVĩnhPhúc Dosyadaki boş satırlar hariç tüm satırların çıktısını almalıdır.
Frej Connolly

2
Bu benim için linux tabanlı bir sistemdeki dosyalar üzerinde çalışır, ancak Windows dosyalarında çalışmaz. Muhtemelen Windows satır sonu karakterleri nedeniyle.

OP'nin Windows satır sonlarıyla bir dosyayı ele alma sorununu tam olarak çözmese de bunu destekliyorum, ancak bu sorunum olmadığından, bu benim için mükemmel bir çözüm olduğu ortaya çıktı.
David Z

1
Bu mükemmel bir çözüm. Basit ve Linux üzerinde çalıştı.
W00f

30

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"

Dos2unix programı bulunamıyor. Windows için mi? ask komutu da çalışmaz.
node ninja

Sor? Hayır, öyle awk.
iconoclast

UNIX stili satır sonlarına dönüştürme konusunda iyi bir nokta, aksi takdirde normal ifadeler beklendiği gibi çalışmayabilir. Hat sonlarını dönüştürene kadar burada hiçbir şey benim için çalışmadı.
Ryan

16
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


2
Bu nasıl ve neden çalışıyor? Açıklayabilirseniz cevabınız çok daha iyi olurdu. Örneğin, normal ifadeniz dizenin başlangıcından sonra POSIX standardını ve sonra dizenin sonunu kullanarak bir veya daha fazla boşlukla eşleşir, yani grep -v ile yalnızca boşluk olan tüm satırları kaldırır. Sağ? Boşluk yoksa ne olur; sadece yeni satır karakteri mi?
Ben

Örneğimde görüldüğü gibi, yalnızca boş bir satır bile kaldırıldı (ilk satır). Daha fazla bilgi ekledim, umarım bu yardımcı olur. :)
Sepero

3

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

Bunu denedim. Boş çizgiler hala gösteriliyor. Bunun nedeni dosyanın Windows'ta yapılmış olması olabilir mi?
node ninja

3

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".


2
awk 'NF' file-with-blank-lines > file-with-no-blank-lines

2

Ö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 -ebir 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 -idoğru araç olurdu.
Yeti

1

Çok denedim, ama bu işe yarıyor gibi görünüyor (varsayalım \rburada ısırıyor):

printf "\r" | egrep -xv "[[:space:]]*"

İlk bölümü dosyadan çıktı ile değiştirirseniz çalışır.
node ninja

0

Perl Kullanımı:

perl -ne 'print if /\S/'

\S boş olmayan karakterlerle eşleşmek anlamına gelir.


0

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


0

kullanın:

grep pattern filename.txt | uniq

uniqbitişik boş satırları yalnızca bir boş satıra indirir, ancak tamamen kaldırmaz. Yine de böyle kullanmayı denemeyi uniqseviyorum. İ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.
Zach Young

İyi bir nokta. Bu, tekrarlanan satırları da kesecektir. Sanırım benim çözümüm hatalar getiriyor.
baitisj

0

İş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

0

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.