Какая разница в сравнении слова со знаком пробела или без него?

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
BDR
источник
Я пропустил это. Я должен был принять «как» строку. Не подстрока.
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текста после замены вы заменяете только первое вхождение.
Дубу