Saya belajar shell-scripting dan untuk itu saya menggunakan HackerRank. Ada pertanyaan terkait sed
di 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?
sed
whitespace
JHA
sumber
sumber
Jawaban:
Perbedaannya adalah apakah ada spasi setelah
the
dalam teks input.Contohnya:
Dengan kalimat tanpa spasi , tidak ada pengganti:
Dengan kalimat dengan spasi , berfungsi seperti yang diharapkan:
Dengan kalimat dengan karakter spasi putih lain , tidak akan ada penggantian:
sumber
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.Ini adalah cara yang murah dan rawan kesalahan dalam melakukan pencocokan kata .
Perhatikan bahwa
the
dengan spasi setelahnya tidak cocok dengan katathereby
, jadi cocokkan dengan spasi setelahthe
menghindari kecocokan string pada awal kata. Namun, masih tidak cocokbathe
(jika diikuti dengan spasi), dan itu tidak cocokthe
di akhir baris.Untuk mencocokkan kata
the
dengan 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:
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\b
di tempat\<
dan\>
:sumber
sed bekerja dengan ekspresi reguler. Menggunakan
sed 's/the /this /'
Anda hanya membuat ruang setelahthe
bagian dari pola yang cocok.Menggunakan
sed 's/the/this/'
Anda mengganti semua kejadianthe
denganthis
tidak masalah jika ada ruang setelahthe
.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
the
dalam katathe theater
:sumber
g
teks pengganti setelah, Anda hanya mengganti kejadian pertama .