Sonunda boşluk olan / olmayan bir kelimeyi eşleştirmenin farkı nedir?


12

Kabuk betikleri öğreniyorum ve bunun için HackerRank kullanıyorum. sedAynı sitede ilgili bir soru var : 'Sed' komutu # 1 :

Belirli bir girdi dosyasındaki her satır için, 'the' kelimesinin ilk oluşumunu 'this' ile dönüştürün. Arama ve dönüşüm kesinlikle büyük / küçük harfe duyarlı olmalıdır.

Her şeyden önce denedim,

sed 's/the/this/'

ancak bu örnek durumda başarısız oldu. Sonra denedim

sed 's/the /this /'

ve işe yaradı. Peki, soru boşlukların ne fark yarattığını ortaya çıkarıyor? Burada bir şey mi eksik?


İlk sürümün de "çalıştığını" varsayıyorum, ancak beklediğiniz gibi değil. Harf dizisi "the" nin ilk oluşumunu değiştirmiş olmalı, ancak büyük olasılıkla "the" kelimesinin ilk oluşumuna bakmış olmalısınız.
Dubu

Bu teoride, evet, pratikte hayır.
Rolf

Yanıtlar:


7

Aradaki fark, thegiriş metninde sonra boşluk olup olmadığıdır .
Örneğin:

Boşluksuz bir cümle ile yerine geçemez:

$ echo 'theman' | sed 's/the /this /'
theman

Boşluklu bir cümle ile beklendiği gibi çalışır:

$ echo 'the man' | sed 's/the /this /'
this man

Başka bir boşluk karakteri olan bir cümle ile değiştirme yapılmayacaktır:

$ echo -e 'the\tman' | sed 's/the /this /'
the     man

Onu özledim. Dize olarak "the" almak zorunda kaldı. Bir alt dize değil.
JHA

1
@JHA: Bir hattın sonunda da önemli. örneğin "the" kelimesi, satırın sonunda satır kaydırmalı bir dosyanın parçası olarak görünebilir, ancak yine de bir paragrafın ortasında olabilir ve bu nedenle de İngilizce cümlede normal bir sözcük olabilir. the( |$)Genişletilmiş normal ifade çalışıyorsa, çalışmaya daha yakın olabilir. Her neyse, IDK ne demek "dize olarak" alt dize. Her iki durumda da tüm hattın bir alt dizisidir ve test vakalarınız "the "başarısız olan durumları tespit etmek için yetersizdir . Kusalanada'nın cevabı önemli ölçüde daha iyi, kabul etmenizi tavsiye ederim.
Peter Cordes

20

Kelime eşleştirme yapmanın ucuz ve hataya açık bir yoludur .

Not olduğunu theo kelimeyi uymuyor arkasına boşluk therebyöylesine arkasına boşluk eşleşen thesözcüklerin başında o dizeyi eşleşen kaçınır. Ancak, yine de vermez maç bathe(ardından bir boşluk varsa) ve o yok değil maç thebir satırın sonunda.

Kelimeyi thedüzgün bir şekilde (veya başka bir kelimeyle) eşleştirmek için, kelimenin başında boşluk kullanmamalısınız. herhangi bir noktalama işareti veya sekme karakteri, örneğin.

Bunun yerine, sıfır genişlikli bir kelime sınır deseni kullanın:

sed 's/\<the\>/this/'

\<Ve \>diğer bir deyişle arasındaki boşluğa, öncesi ve kelimeden sonra sınırlarını maçları kelime karakteri ve bir sigara kelime karakteri . Sözcük karakteri genellikle herhangi bir karakter eşleşmesidir [[:alnum:]_](veya [A-Za-z0-9_]POSIX yerel ayarında).

GNU ile sed, ayrıca kullanabilirsiniz \byerine \<ve \>:

sed 's/\bthe\b/this/'

7

sed düzenli ifadelerle çalışır. sed 's/the /this /'Sizi kullanarak sadece theeşleşen desenin bir kısmından sonra boşluk yapın .

Kullanılması sed 's/the/this/'Eğer tüm tekrarlarını değiştirmek theile thisbir boşluk sonra varsa olursa olsun the.

HackerRank alıştırmasında sonuç aynıdır, çünkü bunun yerine mantıksaldır ... sadece varsayılan olarak boşluk tarafından izlenen bir pro-isim'i değiştirirsiniz (dilbilgisi kuralları).

Örneğin the, kelimenin büyük harfini kullanmaya çalışırsanız farkı görebilirsiniz the theater:

echo 'the theater' |sed 's/the /THE /g'
THE theater                              
#theater is ignored since the is not followed by space

echo 'the theater' |sed 's/the/THE/g'
THE THEater
#both the are capitalized.

Cevap için teşekkür ederim. Takdir :)
JHA

"tüm tekrarları değiştirirsiniz" Açıkça: gDeğiştirme metninden sonra olmadan, yalnızca ilk tekrarlamayı değiştirirsiniz .
Dubu
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.