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.