Sed kullanarak boş satırları silmeye çalışıyorum:
sed '/^$/d'
ama onunla hiç şansım yok.
Örneğin, şu satırlarım var:
xxxxxx
yyyyyy
zzzzzz
ve şöyle olmasını istiyorum:
xxxxxx
yyyyyy
zzzzzz
Bunun kodu ne olmalı?
Sed kullanarak boş satırları silmeye çalışıyorum:
sed '/^$/d'
ama onunla hiç şansım yok.
Örneğin, şu satırlarım var:
xxxxxx
yyyyyy
zzzzzz
ve şöyle olmasını istiyorum:
xxxxxx
yyyyyy
zzzzzz
Bunun kodu ne olmalı?
Yanıtlar:
"Boş" satırınızda boşluklar veya sekmeler olabilir. Kullanım POSIX sınıfları ile sed
sadece boşluk içeren tüm satırları kaldırmak için:
sed '/^[[:space:]]*$/d'
ERE kullanan daha kısa bir sürüm, örneğin gnu sed ile:
sed -r '/^\s*$/d'
(Yok sed Not DEĞİL PCRE'yi destekler.)
-r
sed -i "" '/^[[:space:]]*$/d'
<filename>
,
^\s*$
tüm "boş" satırlarla eşleşir, burada boş anlamına gelir, satır karakter içermez veya satır yalnızca boş dizeler içerir (Örn. Boşluklar). Eşleşen tüm satırlar sed ile sed ile kaldırılır d
.
awk
Çözümü kaçırıyorum :
awk 'NF' file
Hangi dönecekti:
xxxxxx
yyyyyy
zzzzzz
Bu nasıl çalışıyor? Bu yana NF
, bu hatlar boş olan "alanların sayısı" anlamına gelmektedir bu awk yanlış 0 değerlendirir ve bir hat basılır, böylece 0 fiedls sahiptir; ancak, en az bir alan varsa, değerlendirme Doğru'dur ve awk
varsayılan eylemini gerçekleştirir: geçerli satırı yazdırır.
$ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -)
real 0m0.006s
user 0m0.000s
sys 0m0.008s
$ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -)
real 0m0.014s
user 0m0.002s
sys 0m0.006s
Bunu örneğin bir desen gibi bir awk betiğine dahil etmenin şık bir yolunu biliyor musunuz? awk '/ mypattern / {do stuff ...}'
awk 'NF {do stuff...}'
.
sed '/^$/d'
iyi olmalı, dosyayı yerinde değiştirmeyi mi bekliyorsunuz? Eğer öyleyse -i
bayrağı kullanmalısınız .
Belki bu satırlar boş değildir, bu yüzden bu soruya bakın, bu soruya bakın txtfiles'dan boş satırları kaldırın, satırın başından ve satırından boşlukları kaldırmaya çalıştığınız şeyin bu olduğuna inanıyorum.
sed -i '/^$/d'
bunu yapmanın bir yoludur.
[]
gerektiği değil burada kod için doğru değil bu yüzden, parantez ifadelerinde öncelenmelidir \[\[:space:\]\]
veya \[ \t\]
- olmalı [[:space:]]
ve [ \t]
.
Bunun en kolay ve en hızlı olduğuna inanıyorum:
cat file.txt | grep .
Tüm beyaz boşluk çizgilerini de göz ardı etmeniz gerekiyorsa, bunu deneyin:
cat file.txt | grep '\S'
Misal:
s="\
\
a\
b\
\
Below is TAB:\
\
Below is space:\
\
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l
çıktılar
7
5
cat
, grep
dosyaları da alır:grep . file.txt
grep '\S'
kesinlikle taşınabilir değil. Varsa grep -P
kullanabilirsiniz, grep -P '\S'
ancak tüm platformlarda desteklenmez.
grep .
Diğer çözümlere kıyasla dezavantajı, tüm metni kırmızı olarak 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 ^$
Kabul cevap yardımıyla burada ve yukarıdaki kabul cevap, ben kullandım:
$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt
`s/^ *//` => left trim
`s/ *$//` => right trim
`/^$/d` => remove empty line
`/^\s*$/d` => delete lines which may contain white space
Bu, tüm üsleri kapsar ve ihtiyaçlarım için mükemmel çalışır. @Kent ve @kev orjinal posterleri için Kudos
Başka bir seçenek olmadan sed
, awk
, perl
vb
strings $file > $output
dizeler - dosyalarda yazdırılabilir karakter dizelerini yazdırır.
strings
yerine mi demek istiyorsun string
?
Bu awk olarak da çalışır.
awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
Büyük olasılıkla metin dosyanız Windows'da oluşturulduğundan beklenmedik davranışı görüyorsunuz, bu nedenle satır sonu sırası \r\n
. Sed2 komutunu çalıştırmadan veya kullanmadan önce dos2unix dosyasını UNIX stili bir metin dosyasına dönüştürmek için kullanabilirsiniz
sed -r "/^\r?$/d"
satır başı olsun veya olmasın boş satırları kaldırmak için.
-r
bayrak ne yapıyor ve -i
dosyayı doğrudan değiştirmek ve ekrana yazdırmaktan kaçınmak mümkün. Buna ek olarak, bu komutun da işe yarayacağını düşünüyorumsed -r "/^\r$/d"
Özel bash
cevabım, bunun perl
için global örüntü g
bayrağıyla ikame operatörünün kullanılmasını tavsiye etmektir :
$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz
Bu cevap, boş satırların içinde boşluklar olup olmadığı ( [\ ]*
) ve aynı zamanda |
birden çok arama terimini / alanını ayırmak için kullanıldığını hesaplamayı gösterir . MacOS High Sierra ve CentOS 6/7 üzerinde test edildi.
FYI, OP'nin orijinal kodu macOS High Sierra ve CentOS 6/7 Linux üzerindeki Terminal'de yüksek performanslı bir süper bilgi işlem kümesinde sed '/^$/d' $file
gayet iyi çalışıyor bash
.
Sed ile FreeBSD 10.1 ile benim için sadece bu çözümü çalıştı:
sed -e '/^[ ]*$/d' "testfile"
içinde []
boşluk ve sekme sembolleri var.
test dosyası şunları içerir:
fffffff next 1 tabline ffffffffffff
ffffffff next 1 Space line ffffffffffff
ffffffff empty 1 lines ffffffffffff
============ EOF =============