Boş / boş satırlar Unix'teki bir dosyadan (boşluklar dahil) nasıl çıkarılır?


60

Unix / Linux'ta bir dosyadaki boş / boş (yalnızca boşluklar dahil) satırlarını komut satırını kullanarak nasıl kaldırırım?

file.txt içeriği

Line:Text
1:<blank>
2:AAA
3:<blank>
4:BBB
5:<blank>
6:<space><space><space>CCC
7:<space><space>
8:DDD

istenen çıktı

1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD



1
Bu grep, sed, awk kullanarak mümkün olan her çözümü veren epik bir cevaptır: stackoverflow.com/questions/16414410/…
wisbucky

Yanıtlar:


86

Bu sed çizgi hile yapmalı:

sed -i '/^$/d' file.txt

Bu -i, dosyayı yerinde düzenleyeceği anlamına gelir.


13
Yalnızca boşluk içeren satırları kaldırmak için aslında "/ ^ * $ / d" olması gerekir.
Sean Reifschneider

2
@SeanReifschneider Bu cevap yazıldığında bu gereklilik söz konusu değil miydi?
kasperd

4
@SeanReifschneider "/ ^ \ s * $ / d" sekmeleri içerdiğinden daha iyi olmaz mıydı? Orijinal yazıda belirtilmese de, bana daha güçlü bir seçenek gibi geliyor.
mrswadge


Anladımbad flag in substitute command: 'e'
ishandutta2007

29

grep

Basit çözüm, aşağıdaki grep( GNU veya BSD ) komutunu kullanmaktır.

  • Boş satırları kaldırın (boşluk içeren satırlar dahil değil).

    grep . file.txt
    
  • Tamamen boş satırları kaldırın (boşluk içeren satırlar dahil).

    grep "\S" file.txt
    

Not: İstenmeyen renkler elde ederseniz, bunun anlamı greptakma adınızın grep --color=auto(kontrol etme type grep) olduğu anlamına gelir . Bu durumda, --color=noneparametre ekleyebilir veya komutu yalnızca \grep(takma adı yoksayar) olarak çalıştırabilirsiniz .


ripgrep

Benzer ripgrep(daha büyük dosyalar için uygundur).

Boşluk içeren satırlar içermeyen boş satırları kaldırın:

rg -N . file.txt

veya boşluk içeren satırlar dahil:

rg -N "\S" file.txt

Ayrıca bakınız:


2
grep .en basit çözüm gibi görünüyor.
Leo

grep .Diğer çözümlere kıyasla olumsuz, tüm metni kırmızıyla vurgulamasıdır. Diğer çözümler orijinal renkleri koruyabilir. Karşılaştırma unbuffer apt search foo | grep .içinunbuffer apt search foo | grep -v ^$
wisbucky

1
@wisbucky Renkleri görüyorsunuz, çünkü grepsisteminizde takma isim var grep --color=auto(kontrol edin :) type grep. Farklı çalıştırabilir \grepveya --color=noneparametre kullanabilirsiniz .
kenorb

Eğer kullanırsanız @kenorb grep --color=none .: (örnek, özgün komutu renk biçimlendirme geçersiz kılar tüm beyaz metin, alacak apt search foo)
wisbucky

grep .OP'nin istenmediğini söylediği yalnızca boşluk içeren satırlarla eşleşir.
Jim L.

27
sed '/^$/d' file.txt

d bir satırı silmek için sed komutudur. ^$yalnızca boş bir çizgiyle eşleşen normal bir ifadedir, bir satır başlangıcı ve ardından bir satır sonu.


Açıklama için +1
Alex Raj Kaliamoorthy

Bu komut, istenen OP ile aynı çıktıyı üretmez (4 satır değil 5 satır üretir).
kenorb

22

Eşleşen boş satırları kaldırmak için -v seçeneğini grep ile kullanabilirsiniz.

Bunun gibi, böyle

grep -Ev "^$" file.txt

4
İhtiyacınız olduğuna inanmıyorum -E, en azından GNU grep ile değil, ama bunun dışında grep ile yapılanları görmek beni çok mutlu etti! Her seferinde sed tercih etmek için ulaştığım şey bu; satır içi filtreler satır içi düzenleyicilerden daha iyi görünüyor.
MadHatter

Yorumlanmış ve boş satırları atlamak istiyorsanız, özellikle konf. Dosyalar ile uğraşırkengrep -Ev '^#|^$' file.txt
Govind Kailas

7

İşte bir awkçözüm:

awk NF file.txt

Awk ile NFyalnızca boş olmayan satırlara ayarlayın. Bu koşul eşleştiğinde, Awk varsayılan eylemi tüm satırı yazdırmaktır.


6

Boş satırları kaldırmak için tekrar eden yeni satır sıkmalarını yapabilirsiniz tr:

cat file.txt | tr -s '\n' '\n'

Bu OP'nin talep ettiği şekilde 4 değil 6 satır üretir.
kenorb

1

xargs önde gelen boşlukları sıyırma sakıncası yoksa

$ docker run -it --rm alpine sh
/ # cat <<eof > /tmp/file
> one
>
>   two
> three
>
>
>   four
> eof
/ # cat /tmp/file
one

  two
three


  four
/ # cat /tmp/file | xargs -n1
one
two
three
four

0

Ex / um

İşte exeditör (Vim'in bir kısmı) kullanan yöntem :

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

Birden fazla dosya için (yerinde düzenleme):

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

Not: :bufdoKomut POSIX değil .

Dosyayı değiştirmeden (sadece standart çıktıya yazdırın):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin

0

Benim için @ martigin-heemels komutu bu sorunu çözdü (atmak için kukla bir param),

sed -i '' '/^$/d' file.txt


0

Muhtemelen boş satırları kaldırmanın en kolay yolu (boşluksuz) kullanmaktır cat -s:

$ cat -s file
$ some-command | cat -s

En azından bir dosyayı yerinde düzenlemek istemiyorsanız, örneğin terminale yazın. Ayrıca, herhangi bir komik regex işletmesi içermez, bu nedenle RE-dostu olmayan insanlar için bile hatırlaması çok kolaydır.


Kimden man cat:

-s, --squeeze-blank never more than one single blank line

Farklı işletim sistemlerinde farklı olabilir, ancak son kontrol ettiğim birkaç Linux ve OpenBSD'de mevcuttu.

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.