Командная строка: Как найти и заменить все вхождения слова «old_host» на «new_host» во всех файлах .tpl в директории templates?
Для массовой замены текста во всех файлах с расширением `.tpl` в директории `templates` можно воспользоваться несколькими способами в командной строке Linux/macOS.
**Способ 1: Комбинация find + sed (рекомендуется)**
bash
find templates/ -name «*.tpl» -exec sed -i ‘s/old_host/new_host/g’ {} +
Здесь:
— `find templates/` — ищет файлы в директории `templates`
— `-name «*.tpl»` — фильтрует только файлы с расширением `.tpl`
— `-exec sed -i` — выполняет команду `sed` с флагом инлайн-замены (`-i`)
— `’s/old_host/new_host/g’` — шаблон замены: `s` — substitute, `g` — global (все вхождения в строке)
— `{} +` — передаёт найденные файлы пакетом в `sed`
**Способ 2: Рекурсивный grep + sed**
bash
grep -rl ‘old_host’ templates/ —include=’*.tpl’ | xargs sed -i ‘s/old_host/new_host/g’
Здесь `grep -rl` сначала находит только те файлы, которые содержат искомое слово, и передаёт их список через `xargs` в `sed`. Это чуть эффективнее при большом количестве файлов.
**Способ 3: Только sed с glob (bash 4+)**
bash
sed -i ‘s/old_host/new_host/g’ templates/**/*.tpl
Для работы glob-паттерна `**` нужно включить опцию `globstar` в bash:
bash
shopt -s globstar
sed -i ‘s/old_host/new_host/g’ templates/**/*.tpl
**Важные нюансы:**
1. **macOS**: флаг `-i` требует явного указания суффикса резервной копии. Используйте `-i »` (пустая строка) для замены без создания бэкапа:
bash
find templates/ -name «*.tpl» -exec sed -i » ‘s/old_host/new_host/g’ {} +
2. **Резервная копия**: если хотите сохранить оригиналы, укажите суффикс:
bash
sed -i.bak ‘s/old_host/new_host/g’ …
Это создаст файлы `.tpl.bak` с оригинальным содержимым.
3. **Проверка перед заменой**: сначала выполните поиск без замены, чтобы убедиться в корректности:
bash
grep -rn ‘old_host’ templates/ —include=’*.tpl’
4. **Спецсимволы**: если в строке поиска или замены есть `/`, экранируйте их `/` или используйте другой разделитель в sed, например `|`:
bash
sed -i ‘s|old_host|new_host|g’
Рекомендуемый универсальный вариант для Linux:
bash
find templates/ -name «*.tpl» -exec sed -i ‘s/old_host/new_host/g’ {} +
