'[Az] *' neden alfabetik olmayan dizelerle eşleşiyor?


9

alphanumBu iki satırlı bir dosya var :

123 abc
this is a line

Neden koştuğumda sed 's/[a-z]*/SUB/' alphanumşu çıktıyı alıyorum diye kafam karıştı :

SUB123 abc
SUB is a line

Bekliyordum:

123 SUB
SUB is a line

Bir düzeltme buldum ( sed 's/[a-z][a-z]*/SUB/'bunun yerine kullanın), ancak neden çalıştığını anlamıyorum ve benimki çalışmıyor.

Yardım edebilir misin?



@Kamaraj, buna benzer, ancak üstte regexes karışıklığına karşı kabuk desenleri var (ve cevaplar öncekine yoğunlaşıyor, çünkü ls foo*orada kullanılan şey budur). Her neyse, yinelenen sorular bulursanız, bunları da böyle işaretleyebilmeniz gerektiğini düşünüyorum.
ilkkachu

canlı görseller ve açıklamalar için regexr.com'a göz atın
RozzA

@RozzA Bağlantı verdiğiniz web sitesinin POSIX normal ifadelerini değil Javascript ve Perl normal ifadelerini desteklediğini unutmayın.
Kusalananda

Yanıtlar:


28

Desen [a-z]*maçları sıfır aralığında veya daha fazla karakter aiçin z( gerçek karakterleri geçerli yerele bağlıdır). Dizenin en başında sıfır gibi karakterler 123 abc(yani desen eşleşir) ve başında dördü vardır this is a line.

En az bir eşleşmeye ihtiyacınız varsa , veya tuşlarını kullanın [a-z][a-z]*veya [a-z]\{1,\}ile genişletilmiş düzenli ifadeleri etkinleştirin sed -Eve kullanın [a-z]+.

Desenin nerede eşleştiğini görselleştirmek için her eşleşmenin çevresine parantez ekleyin:

$ sed 's/[a-z]*/(&)/' file
()123 abc
(this) is a line

Veya satırlardaki tüm eşleşmeleri görmek için:

$ sed 's/[a-z]*/(&)/g' file
()1()2()3() (abc)
(this) (is) (a) (line)

Son sonucu şununla karşılaştır:

$ sed -E 's/[a-z]+/(&)/g' file
123 (abc)
(this) (is) (a) (line)

7
Birden fazla karakterden yapılabilen harmanlama öğelerini teknik olarak [a-z]eşleştirir . Örneğin, bazı Macar yerel ayarlarında maçlar[a-z]dzs
Stéphane Chazelas

12

Çünkü önceki atomun sıfır veya daha fazla tekrarıyla *eşleşir ve tüm regex motorları ilk eşleşmeyi bulmaya çalışır. Dizenizin başlangıcında tam olarak sıfır harfli bir alt dize var, bu yüzden eşleştiği yer burası. Dizenin bir harfle başlaması durumunda, olabildiğince çok eşleşir, ancak bu en soldaki eşleşmeyi bulmak için ikincildir.*

Sıfır uzunluklu eşleşmeler biraz sorunlu olabilir ve gördüğünüz gibi çözüm, deseni en az bir karakter gerektirecek şekilde değiştirmektir. Genişletilmiş normal ifadelerle şunları yapabilirsiniz +:sed -E 's/[a-z]+/SUB/'

Eğlenmek için şunu deneyin:

echo 'less than 123 words' | sed 's/[0-9]*/x/g'
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.