Cümlenin bitiminden sonra iki boşluğun tüm tekrarlarını tek bir boşlukla değiştirin


9

Bir sed komutuyla düzenli ifadeler eklemekte sıkıştım.

S: Bir cümlenin bitiminden sonra iki boşluğun tüm oluşumlarını bir kez boşluk ile değiştirmek istiyorum .

İşte yaptığım şey:

sed 's/^ $/^$/' file  

Ve cümle bittikten sonra iki boşluğu bir boşlukla değiştirmedi.

Çıktı alıyorum:

This is the output.  Hello Hello

Çıktı istiyorum:

This is the output. Hello Hello

@Rahul Cümle bittikten sonra boşluk içeren bir çıktı istiyorum. İlk cümlede olduğu gibi iki boşluk değil. İkinci cümle çıktısını istiyorum
— Zeus

@Jasen'in cevabı doğrudur. BTW, denediğiniz komutun anlamı: Yalnızca tek bir boşluktan oluşan bir satırı boş bir satırla değiştirin. Bu yüzden istediğini yapmadı.
— rexkogitans

1
Buraya ekleyin: tam durduktan sonra tek veya çift boşluk savaşı
— gerrit

@gerrit Bu savaş yaklaşık 20 yıl önce kayboldu. ;)
— h4ckNinja

Yanıtlar:


12
 sed 's/\.   */. /g' < file

noktayı ve ardından iki veya daha fazla boşluğu nokta ve ardından tek bir boşluk ile değiştirin.


Komutunuz aslında tüm paragraf için çalışır. Ben de tam olarak bunu istedim. Teşekkürler!
— Zeus

veya sed -r 's/\.\s+/. /g' fileGNU sed ile ...
— Sundeep

@ spasic kullanım sed -Eyerine sed -r. Bu, GNU sed ve * BSD sed (Mac OS X dahil) ve diğerleri ile çalışır. POSIX'te "çok yakında gerçek" olarak standart olarak dahil edilmesi planlanıyor.
— cas

@cas Bir süre önce hatırlıyorum sed -E, bu sitede işe yaramayan ama sed -rişe yarayan birine önerdim .. Yalnız GNU sed ile çalıştım, bu yüzden POSIX ve diğer varyasyonlar hakkında hiçbir fikrim yok .. bu detayı gelecekte dahil etmeye çalışacağım , teşekkürler :)
— Sundeep

GNU sed'in eski bir sürümü olmalıydı. -EBir süredir desteklediler (en azından 2011'den beri, ancak adam ve bilgi sayfalarında hala bahsediliyor -r)
— cas

13

Sizin sedkomut 's/^ $/^$/'istediğini yapmayacağım. Sadece bir satır içeren bir satır içeren bir satır içerir ^$.

Hangi karakterlerin cümlenin sonunu gösterdiğine bağlı olarak şunları yapabilirsiniz:

sed -e 's/\([.?!]\) \{2,\}/\1 /g' <file

Bu daha sonra 2 ya da daha fazla boşluk yerini alacak ., ?ya da !sadece bir boşluk vardır.


1
kısaltılabilirsed -r 's/([.?!])\s+/\1 /g' file
— Sundeep

Teşekkürler. Ama neden bu kadar çok yuvarlak, köşeli parantez kullandığınızı ayrıntılı olarak açıklar mısınız? Biraz kafa karıştırıcı.
— Zeus

1
@spasic: Bu, basitleştirilmiş sürümle güncellenen yalnızca GNU sed ile çalışır.
— cuonglm

@Zeus: Bu, varsayılan BRE ile standart sözdizimidir.
— cuonglm

1
Hayır, orijinal seddüzenleme komut dosyası, tek bir boşluk içeren herhangi bir satırı değişmez dizeyle değiştirir ^$.
— Kusalananda

7

Aradığın şey bu,

tr -s " " <filename

Örneklem,

$ echo "This is the output.  Hello Hello" | tr -s "[:blank:]"
This is the output. Hello Hello

Kullanmak sed,

$ echo "This is the output.  Hello Hello" | sed 's/\. \+/. /g'
$ echo "This is the output.  Hello Hello" | sed 's/\. \{1,\}/. /g'
This is the output. Hello Hello

2
Çalışıyor teşekkürler, ama sed komutunu eklemem gerekiyor. Lütfen yukarıda gösterilene benzer bir şey söyle, yerine koyma, metni değiştir vb.
— Zeus

2
Bu tr özelliğinin farkında değildim
— Jasen

3
Bu yaklaşım, cümlenin sonu olmayan iki alanın da yerini alacaktır.
— cuonglm
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.