Beyaz boşluk sed içinde eşleştirilir?


218

Boşlukta sed ile nasıl eşleştirebilirim? Verilerimde sonraki 3+ sonraki boşluk karakterlerini (sekme boşluğu) eşleştirmek ve 2 boşlukla değiştirmek istiyorum. Bu nasıl yapılabilir?

Yanıtlar:


226

Karakter sınıfı \sboşluk karakterlerini eşleşir <tab>ve <space>.

Örneğin:

$ sed -e "s/\s\{3,\}/  /g" inputFile

en az 3 boşluktan oluşan her sekansı iki boşlukla değiştirecektir.


AÇIKLAMA : POSIX uyumluluğu için, bir GNU sed uzantısı olduğu için karakter sınıfını [[:space:]]kullanın \s. Sed ve BRE'ler için POSIX teknik özelliklerine bakın


5
Aha! Beni ele geçiren kayıp anahtardı.
sequoia mcdowell 12:11

25
Ayrıca genişletilmiş regex'lerin sed '\ s' i alan olarak tanımasını sağlayan '-r' anahtarını eklemek zorunda kaldım.
HUB

39
Apple sedile kullanmak zorunda kaldım, [[:space:]]çünkü \sbenim için işe yaramadı. Belki \sbir GNU sed uzantısıdır?
Jared Beck,

2
Benim basit regex wasnt çalışma .. Bu topal neden @JaredBeck sayesinde fikir gelmiyordu, ben .. Ayrıca çalışmıyor -r \ s standart genişletilmiş düzenli ifade olduğunu düşünmüş ve -E bodur yaptılar
Karthik yine T

3
[[:space:]Biri yerine [[:blank:]]yalnızca yatay sekmeler ve boşluklarla eşleşen (ancak yeni satırlar, dikey sekmeler vb. Olmayan) kullanabilirsiniz.
stefanct

67

Bu MacOS 10.8’de çalışır:

sed -E "s/[[:space:]]+/ /g"

2
Bunun tüm Linux dağıtımlarında işe yarayıp yaramadığını biliyor musunuz?
amfi

2
Genelde değil, GNU sed'de -E olmaz. BSD sed man sayfasından: "-E, -a ve -i seçenekleri standart olmayan FreeBSD uzantılarıdır ve diğer işletim sistemlerinde bulunmayabilir."
Brad Koch

1
+ Operatörü için neden -E bayrağına ihtiyacınız var? Çoğu ifade muhtemelen * ile iyi sonuç verirdi, o zaman bu diğer platformlarda da işe yarayacaktı.
Samuel

5
@Samuel * kullanırsanız, regex sıfır veya daha fazla boşlukla eşleşir ve her karakter arasında ve her satırın her bir ucunda bir boşluk bulunur. -E bayrağına sahip değilseniz, sed "s/[[:space:]]\+/ /g"bir veya daha fazla boşlukla eşleştirmek istiyorsunuz .
jbo5112

1
FWIW, NetBSD'nin sed'i -Ebayrağı da destekliyor .
Mcandre

13

Bazı eski sed sürümleri \ 'yi bir beyaz boşluk eşleme simgesi olarak tanımayabilir. Bu durumda, X'in bir boşluk ve Z'nin bir sekme olduğu '[XZ] [XZ] *' ile bir veya daha fazla boşluk ve sekme dizisini eşleştirebilirsiniz.


1
Bu nedenle, buradaki özel ihtiyaç için, daha eski bir sed ile şunları yapabilirsiniz: $ sed 's / [XZ] [XZ] [XZ] [XZ] * / / g' giriş dosyası, X bir tab ve Z bir boşluktur.
Marnix A. van Ammers

10
sed 's/[ \t]*/"space or tab"/'

2
Bunun sedherhangi bir sistemde herhangi bir sürümünde çalışacağı garanti ediliyor mu? Bunun nerede diğer cevaplarla benzer şekilde çalıştığını söylemeye değmezse, sınırlamaları ve bunun istenen sonucu elde edemeyeceğini biliyoruz.
Mokubai

2
Bu RE boşlukla eşleştirmek için kullandığım şey. Sadece sekme veya boşluğu eşleştirmek için karakter sınıflarından daha basittir. Düzenli ifadelerin yalnızca en temel kurallarını kullanır, bu nedenle normal ifadelerin işlevsel bir uygulamasıyla her yerde çalışması gerekir.
Nate,

3
Mac 10.9.5'te bu, boşluklar ve 't' ile eşleşir. Michael Douma'nın yukarısındaki boşluk karakterleriyle eşleşmesi için kullandım (-e ile de çalışıyor).
Alien Yaşam Formu

SUSE sistemimde makul bir şekilde çalışmıyor. İlk karakterden önce sıfır veya daha fazla boşluğun olduğu satırdaki ilk yerle eşleşir. Bunun amaçlanan işlev olduğundan şüpheliyim ve kesinlikle istenen kullanım örneği değildi. Ben '*' için '\ +' (veya soru başına '\ {3, \}') değiştirmek istediğinizi ve belki de kalıbın tüm oluşumlarını eşleştirmek için sed komutunun sonuna bir ag koyacağınıza inanıyorum. [\ T] 'yi [[: space:]] ile değiştirmek, hatta boşlukta başka bir şey olması durumunda da istenebilir.
jbo5112
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.