Çok fazla boş satır içeren bir belgem var.
Birlikte 2 veya daha fazla olduğunda onları nasıl kaldırabilirim.
sed "s/\n\n//"
Dosyayı denedim ama işe yaramadı. Hata yok.
Çok fazla boş satır içeren bir belgem var.
Birlikte 2 veya daha fazla olduğunda onları nasıl kaldırabilirim.
sed "s/\n\n//"
Dosyayı denedim ama işe yaramadı. Hata yok.
Yanıtlar:
Sadece boş satırları kaldırmak için:
sed '/^$/d'
sed
Satır yönelimlidir, bu nedenle baytın yeni bir satır olması dışında "belirli bir baytın 2 veya daha fazlası" olarak düşünülmesi işe yarar. O zaman bütün çizgi için işe yarayan bir şey düşünmelisin.
sed
"desen alanı" / "tutma alanı" özelliği ile birkaç çizgiyi işleme kapasitesine sahiptir. Ama bunun çok karmaşık olduğunu hissediyorum. ;-)
1!
böylece (hat 1 hariç tüm maç),: sed '1!{/^$/d'}
.
sed
. Bir dosya oluşturmak, esas olarak aynı ada sahip herhangi bir dosyayı siler. sed '/^&/d' file.txt > otherfile.txt
çalışacak.
Gerek yok sed
. grep
yapacağım:
grep .
(bu grep
, SPC, nokta, bu en az bir karakter içeren herhangi bir satırla eşleşir).
Ayrıca:
tr -s '\n'
(yeni satır karakterlerinin herhangi bir sırasını bir taneye sıkın).
Chris tarafından belirtildiği gibi, her ikisi de eşdeğer değildir, çünkü boş satırların kaldırılması (yukarıdaki ilk çözüm gibi ve buradaki diğer cevapların çoğu), ilk satırın boş olduğu durumda talep edilen yeni satır karakterlerinin sıkma dizileriyle aynı değildir. ilk satırı boş bırakmak için yalnızca bir tane yeni satır karakteri alır .
@Bruce Ediger'in cevabını görmüş sed
Bunun için en iyi araç değildir, çünkü satır bazlıdır ve satır \n
sonu karakteri gibi davranırsa bu karmaşıklaşır.sed
olmak iş için mükemmel bir araç olabilir, yine de, işte başka seçenekler:
Perl
perl -ne 'print if /./' file.txt
veya
perl -pe '$/=""; s/\n+/\n/;' file.txt
Teşekkür etmek @ruakh gitmeme yaptı ve okuyanlar bu :
, $ /
Giriş kaydı ayırıcı, varsayılan olarak newline. Bu Perl'in bir "çizgi" ne olduğu fikrini etkiler. Boş dizeleri boş dizgeye ayarlanmışsa, boş satırların sonlandırıcı olarak ele alınması da dahil olmak üzere awk RS değişkeni gibi çalışır (boş bir satır boşluk veya sekme içeremez). Çok karakterli bir sonlandırıcıyla eşleşmesi için çok karakterli bir dizeye veya dosyanın sonuna kadar okumak için tanımsız olarak ayarlayabilirsiniz. "\ N \ n" olarak ayarlamak, dosya arka arkaya boş satırlar içeriyorsa, "" ayarından biraz farklı bir şey anlamına gelir. "" Olarak ayarlamak, iki veya daha fazla ardışık boş satırı tek bir boş satır olarak değerlendirir. "\ N \ n" olarak ayarlamak, yeni bir satır olsa bile, bir sonraki giriş karakterinin bir sonraki paragrafa ait olduğunu kabul eder.
gawk / awk
awk '$1' file.txt
Bu, yayınlanan örnek için işe yarayacak, ancak @ Stephane Chazelas'ın işaret ettiği gibi, ilk alanı "benzeyen" satırları da silecektir 0
. Bu daha sağlam:
awk NF file.txt
perl -pe 's/\n+/\n/ file.txt
yapacak, giriş kayıt ayırıcı bu kullanım için önemli değil.
perl -pe
ya da perl -ne
çalışma satır satır. \n+
Asla eşleşmeyecektir, çünkü sadece tek bir satıra uygulanır. Bu yüzden bütün dosyayı ayarlamalısınız $/
veya kullanmalısınız . -0
perl -0pe 's/\n+/\n/' file
Kaldırmak derken ne demek istiyorsun? yinelenen kaldır (bire bir çok boş satır) ya da tümünü kaldırmak?
Çoğaltmayı kaldırmak istiyorsanız, sed yöntemini burada bulabilirsiniz:
sed '$!N; /^\(.*\)\n\1$/!P; D'
uniq
Komutu simüle eder .
En iyi seçenek kullanıyor awk
:
awk NF <filename>
sed
kısmı harika çalışıyor! Bunu en iyi cevap olarak önermek.
Bu cevapların çoğu için önce sondaki boşlukları kaldırmak gerekir. İki katına çıkan yeni satırların kaldırılması tüm boş satırları kaldırır. (Bunun hakkında düşün).
Kelimenin tam anlamıyla yorumlanması OP "yinelenen boş satır varsa, dosyadaki tüm boş satırların kaldırılmasını" istiyor.
Tipik kullanıcı "sadece kopyalanan boş satırları kaldırmak" istiyor.
Bunu yapmak için, önce sondaki beyaz boşluğu soyun ve tekrar katlayın.
sed s/[[:space:]]*$// | cat -s
Ve yine de bu, bir üst veya sondaki boş çizgiyi kaldırmaz.
Herhangi bir boş satır dizisi için tek bir boş satır tutmak isterseniz, aşağıdakileri yapabilirsiniz:
sed -e '/./b' -e :n -e 'N;s/\n$//;tn'
cat -s
) aslında soruyu tam olarak sorduğumda sorduğu şeyi gerçekleştiren tek cevap . (Ve cat -s
kullanabildiğimden daha iyidir sed -i
.)
Her ikisini de alan ayırıcınız olarak sed -e 's#\\n\\n#\\n#g' input.file > output.file
kullanmayı deneyin /
ve regex'inizin bir kısmı sorun olabilir.
Bu komutu kullanın:
tr -s '\r' '\n'
echo -e 'one\r\n\r\n\r\n\rtwo'| tr -s '\r' '\n'
. Komut tr
tüm çevirecek \r
için \n
tüm sıkmak olacak sonra ve \n
sadece bir hiç. Bu yüzden çalışır, bunun UNIX için değil, pencereler için geçerli olduğu konusunda ne yapacağından emin değildir.