2010-05-27 16 views
6

Boş satır içeren bir belgem var (\ n \ n). Bunlar perl ile normal bir ifadeyle nasıl yapabilirim? Aşağıdaki gibi bir şey, hiçbir sonuç göstermez.Birden çok yeni satırı, Perl'in Normal İfadeleriyle tek bir taneyle nasıl değiştirebilirim?

echo $'a\n\nb'|perl -p -e 's/\n\n/\n/s' 
+4

Kabuk komut dosyası için bir filtre olarak ihtiyacınız varsa, örneklerinizdeki gibi, "cat -s" ile daha hızlı ve daha uyumlu olursunuz. – Marian

+0

@Marian İşaret ettiğin için teşekkürler. Sadece bugüne kadar "kedi yavrusu" okumamı fark ettim. –

+0

@Marian Daha sonra giriş olarak buna ihtiyacım yok; Ama yine de, bunu işaretlediğiniz için teşekkürler. Gelecekte bunu kullanıyor olabilirim :) –

cevap

13

s/^\n\z//'u kullanmanız gerekir. Girdi satırdan okunur, böylece birden fazla yeni satır elde edemezsiniz. Bunun yerine, başka karakterler içermeyen satırları kaldırın. Sen

perl -ne 's/^\n\z//; print' 

/s anahtarı için ihtiyaç kullanılarak perl çağırmak gerekir.

+1

Bu dosya bir kerede tamamen slurping daha güzel, dosya gerçekten büyük olup olmadığını iyi bir fikir değil. – Ether

+1

Basit ve verimli –

+0

Bunu yapmanın biraz farklı bir yolu 'perl -pne'/^ \ n \ z // '. '-p' seçeneğiyle' print''a gerek yoktur. – steveb

4

Girdi üç ayrı satırdır ve -p seçeneğiyle perl seçeneği yalnızca bir satırı işler.

Çözüm, birden çok giriş satırında bir kerede kırpmak için perl bildirmektir. Bunu yapmanın bir yolu şudur:

İşte $/
echo $'a\n\nb' | perl -pe 'BEGIN{$/=undef}; s/\n\n/\n/' 

nasıl hatları içine bir giriş akışı ayrıştırmak için Perl söyler record separator variable vardır.

6

boş satır baskı yapmadığı dar sorun daha basittir:

$(input) | perl -ne 'print if /\S/' 

çıktısı sadece boşluk içeren dışındaki tüm hatları.

İlgili konular