Я изучаю сценарии оболочки и для этого я использую HackerRank. На sed
том же сайте есть вопрос, связанный с командой «Sed» # 1 :
Для каждой строки в данном входном файле преобразуйте первое вхождение слова 'the' в 'this'. Поиск и преобразование должны быть строго регистрозависимыми.
Прежде всего я пытался,
sed 's/the/this/'
но в этом примере контрольный пример не удался. Потом я попробовал
sed 's/the /this /'
и это сработало. Итак, возникает вопрос, какую разницу создали пробелы? Я что-то здесь упускаю?
sed
whitespace
ПВД
источник
источник
Ответы:
Разница в том, есть ли пробел после
the
во входном тексте.Например:
С предложением без пробела , без замены:
С предложением с пробелом работает как положено:
С предложением с другим символом пробела замена не произойдет:
источник
the( |$)
может быть ближе к работе, если это расширенное регулярное выражение работает. Во всяком случае, IDK, что вы подразумеваете "как строка" против подстроки. В обоих случаях это подстрока всей строки, и ваших тестовых случаев недостаточно для выявления случаев, когда происходит"the "
сбой. Ответ Кусаланада значительно лучше, я бы рекомендовал принять его.Это дешевый и подверженный ошибкам способ сопоставления слов .
Обратите внимание, что
the
с пробелом после него не совпадает словоthereby
, поэтому сравнение с пробелом послеthe
позволяет избежать сопоставления этой строки в начале слова. Тем не менее, он все равно совпадаетbathe
(если за ним следует пробел) и не совпадаетthe
в конце строки.Чтобы
the
правильно сопоставить слово (или любое другое слово), вы не должны использовать пробелы вокруг слова, так как это помешает вам сопоставить его в начале или конце строк или если оно окружено любым другим несловесным символом, таким как любой знак пунктуации или табуляции, например.Вместо этого используйте шаблон границы слова нулевой ширины:
Символ
\<
и\>
совпадает с границами до и после слова, т. Е. Пробел между символом слова и несловесным символом . Символ слова, как правило, соответствует любому символу[[:alnum:]_]
(или[A-Za-z0-9_]
в локали POSIX).С GNU
sed
вы также можете использовать\b
вместо\<
и\>
:источник
sed работает с регулярными выражениями. Используя
sed 's/the /this /'
вы просто сделайте пространство послеthe
части сопоставленного шаблона.Использование
sed 's/the/this/'
заменить все вхожденияthe
сthis
независимо от того , если пространство существует послеthe
.В упражнении HackerRank результат тот же, потому что заменить на это логично ... вы заменяете только имя существительное, за которым по умолчанию следует пробел (правила грамматики).
Вы можете увидеть разницу, если попытаетесь, например, использовать заглавные буквы
the
в словеthe theater
:источник
g
текста после замены вы заменяете только первое вхождение.