Apa bedanya mencocokkan kata dengan / tanpa spasi spasi tambahan?


12

Saya belajar shell-scripting dan untuk itu saya menggunakan HackerRank. Ada pertanyaan terkait seddi situs yang sama: perintah 'Sed' # 1 :

Untuk setiap baris dalam file input yang diberikan, ubah kemunculan pertama kata 'the' with 'this'. Pencarian dan transformasi harus sepenuhnya case-sensitive.

Pertama-tama saya mencoba,

sed 's/the/this/'

tetapi dalam kasus uji sampel gagal. Lalu saya mencoba

sed 's/the /this /'

dan itu berhasil. Jadi, muncul pertanyaan apa bedanya ruang putih dibuat? Apakah saya melewatkan sesuatu di sini?


Saya menganggap versi pertama juga "berhasil", tetapi tidak seperti yang Anda harapkan. Seharusnya menggantikan kemunculan pertama dari urutan huruf "the", tetapi Anda mungkin melihat kemunculan pertama kata "the".
Dubu

Nah, dalam teori ini, ya, dalam praktiknya, tidak.
Rolf

Jawaban:


7

Perbedaannya adalah apakah ada spasi setelah thedalam teks input.
Contohnya:

Dengan kalimat tanpa spasi , tidak ada pengganti:

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

Dengan kalimat dengan spasi , berfungsi seperti yang diharapkan:

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

Dengan kalimat dengan karakter spasi putih lain , tidak akan ada penggantian:

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

Saya melewatkan itu. Saya harus mengambil "the" sebagai string. Bukan substring.
JHA

1
@ JHA: Itu juga penting di akhir baris. misalnya kata "the" dapat muncul di akhir baris sebagai bagian dari file dengan pembungkus baris, tetapi masih di tengah paragraf dan dengan demikian masih menjadi kata normal dalam kalimat bahasa Inggris. the( |$)mungkin lebih dekat untuk bekerja, jika Extended regex berfungsi. Pokoknya, IDK apa yang Anda maksudkan "sebagai string" vs. substring. Dalam kedua kasus itu adalah substring dari seluruh baris, dan testcases Anda tidak cukup untuk mendeteksi kasus di mana "the "gagal. Jawaban Kusalanada secara signifikan lebih baik, saya sarankan menerimanya.
Peter Cordes

20

Ini adalah cara yang murah dan rawan kesalahan dalam melakukan pencocokan kata .

Perhatikan bahwa thedengan spasi setelahnya tidak cocok dengan kata thereby, jadi cocokkan dengan spasi setelah themenghindari kecocokan string pada awal kata. Namun, masih tidak cocok bathe(jika diikuti dengan spasi), dan itu tidak cocok thedi akhir baris.

Untuk mencocokkan kata thedengan benar (atau kata lain), Anda tidak boleh menggunakan spasi di sekitar kata, karena itu akan mencegah Anda mencocokkannya di awal atau di akhir baris atau jika diapit oleh karakter non-kata lain, seperti tanda baca atau karakter tab, misalnya.

Sebagai gantinya, gunakan pola batas kata nol-lebar:

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

Tanda \<dan \>cocok dengan batas sebelum dan sesudah kata, yaitu ruang antara karakter kata dan karakter non-kata . Karakter kata umumnya adalah setiap karakter yang cocok [[:alnum:]_](atau [A-Za-z0-9_]di lokal POSIX).

Dengan GNU sed, Anda juga dapat menggunakan \bdi tempat \<dan \>:

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

7

sed bekerja dengan ekspresi reguler. Menggunakan sed 's/the /this /'Anda hanya membuat ruang setelah thebagian dari pola yang cocok.

Menggunakan sed 's/the/this/'Anda mengganti semua kejadian thedengan thistidak masalah jika ada ruang setelah the.

Dalam latihan HackerRank, hasilnya sama karena untuk mengganti dengan ini logis ... Anda mengganti hanya pro-kata benda yang secara default diikuti oleh spasi (aturan tata bahasa).

Anda dapat melihat perbedaannya jika Anda mencoba misalnya menggunakan huruf besar thedalam kata 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.

Terima kasih atas jawabannya. Dihormati :)
JHA

"Anda mengganti semua kemunculan" Untuk menjadi jelas: Tanpa gteks pengganti setelah, Anda hanya mengganti kejadian pertama .
Dubu
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.