Как заставить команду sed искать только полные слова?

Я довольно новичок в Linux и недавно начал экспериментировать с командной строкой. Я решил сделать файл и назвал его «hi.txt». Содержание документа:

This is hi.txt. hi hi hi 

Я использовал команду sed -i 's/hi/hotel/g' hi.txt в надежде превратить все «привет в документ» в гостиницу. Это был результат:

 Thotels is hotel.txt hotel hotel hotel 

Как вы можете видеть, «привет» – это слово «Это» также изменилось. Есть ли способ остановить это?

Команда s/// ожидает, что параметр «поиск» будет регулярным выражением . Большинство версий sed должны поддерживать соответствие \b совпадающее с нулевой шириной в слове «неслово» или границе слова. «Слово» в этом случае определяется как символ, который является либо буквой, либо цифрой, либо подчеркиванием ( _ ). Например, если мы предположим, что строка c++ находится в отдельной строке в вашем файле, \b будет соответствовать следующим позициям:

  1. Непосредственно перед c .
  2. Между c и первым + .
  3. Сразу после последнего + .

Следующая команда должна дать вам желаемые результаты:

 sed -i 's/\bhi\b/hotel/g' hi.txt 

Слово this не будет соответствовать, потому что h предшествует символ слова ( t ), а за i следует символ ( s ) слова. Однако строка This is hi.txt будет совпадать со вторым экземпляром hi , потому что окружающее пространство и . оба являются символами без слова.

 $ sed -e 's/\([^[:alnum:]_.-]\)hi\([^[:alnum:]_.-]\)/\1hotel\2/g' -e 's/^hi$/hotel/' <file This is hi.txt. hotel hotel hotel