Яку різницю має відповідати слово з / без пробілів?


12

Я вивчаю сценарії оболонок і для цього використовую HackerRank. На sedцьому ж сайті є питання, пов’язане з командою "Sed" №1 :

Для кожного рядка в заданому вхідному файлі перетворіть перше виникнення слова "the" на "this". Пошук та перетворення повинні суворо залежно від регістру.

Перш за все я спробував,

sed 's/the/this/'

але в тому зразку тестового випадку не вдалося. Потім я спробував

sed 's/the /this /'

і це спрацювало. Отже, виникає питання, яку різницю створили пробіли? Я щось тут пропускаю?


Я припускаю, що перша версія також "спрацювала", але не так, як ви очікували. Це повинно було замінити перше виникнення букви послідовності "the", але ви, мабуть, подивилися на перше виникнення слова "the".
Дубу

Ну, в цій історії так, на практиці ні.
Рольф

Відповіді:


7

Різниця полягає в тому, чи є пробіл theу тексті вводу.
Наприклад:

З пропозицією без пробілу , без заміни:

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

З реченням з пробілом працює так, як очікувалося:

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

У реченні з іншим символом пробілу жодна заміна не відбудеться:

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

Я пропустив це. Мені довелося сприймати "то" як струну. Не підрядка.
JHA

1
@JHA: Це також має значення в кінці рядка. наприклад, слово "the" може з'являтися в кінці рядка як частина файлу з обгортанням рядків, але все ж знаходиться в середині абзацу і, таким чином, все ще є звичайним словом в англійському реченні. the( |$)може бути ближче до роботи, якщо цей розширений регулярний вираз працює. У будь-якому випадку, IDK, що ви маєте на увазі "як рядок" проти підрядків. В обох випадках це підрядок всієї лінії, і ваші тестові шкали недостатньо для виявлення випадків, коли відбувається "the "збій. Відповідь Кусаланади значно краща, я б рекомендував її прийняти.
Пітер Кордес

20

Це дешевий і схильний до помилок спосіб зіставлення слів .

Зауважте, що theпробіл після нього не відповідає слову thereby, тому відповідність пробілу після theуникнення відповідності цьому рядку на початку слів. Однак він все одно збігається bathe(якщо за ним пробіл), і він не відповідає theв кінці рядка.

Щоб theправильно відповідати слову (або будь-якому іншому слову), ви не повинні використовувати пробіли навколо слова, оскільки це не дозволить вам зіставити його на початку чи в кінці рядків або якщо воно поруч із будь-яким іншим символом, немовним словом, наприклад будь-який розділовий знак або символ вкладки, наприклад.

Замість цього використовуйте граничну схему слова нульової ширини:

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

Значення \<і \>відповідає меж перед і після слова, тобто пробіл між символом слова та символом, що не має слова . Символ слова, як правило, відповідає будь-якому символу [[:alnum:]_](або [A-Za-z0-9_]в мові POSIX).

З GNU sedви також можете використовувати \bзамість \<та \>:

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

7

sed працює з регулярними виразами. Використовуючи, sed 's/the /this /'ви просто зробите пробіл після theчастини узгодженого шаблону.

Використання sed 's/the/this/'замінити всі входження theз thisнезалежно від того , якщо простір існує після the.

У вправі HackerRank результат той самий, тому що замінити на це логічно ... ви замінюєте просто іменник, за замовчуванням якого пробіл (граматичні правила).

Ви можете побачити різницю, якщо спробувати, наприклад, використовувати великі літери theу слові 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.

Дякую за відповідь.
JHA

"Ви замінюєте всі події" Щоб було зрозуміло: без gтексту після заміни ви замінюєте лише перше виникнення.
Дубу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.