Команды Linux и навыки работы с оболочкой
sed: редактирование потоков без открытия редактора
sed редактирует вбок: через него проходят целые потоки текста, выходят преобразованными, и ни один редактор не открывается. Его репутация основана на ключе -i, который превращает однострочную замену в пакетную операцию над тысячами файлов, а также на историях о катастрофах администраторов, которые запускали его без суффикса резервной копии. Безопасный рабочий процесс никогда не меняется: запустите видимую замену, подтвердите вывод, затем добавьте -i с суффиксом и сохраните код выхода.
Главное
- Предварительный просмотр перед фиксацией: файл sed -n '10,20p' показывает диапазон строк, и та же комбинация -n плюс p печатает только строки, соответствующие регулярному выражению или адресу.
- Замените флагами, которые делают то, что вы имеете в виду: s/old/new/g для всех совпадений, число типа 2g только для второго и -E для расширенного регулярного выражения без страницы с обратной косой чертой.
- Изменения на месте получают суффикс, без исключений: приложение sed -i.bak 's/http:/https:/g' сохраняет резервную копию с тем же именем рядом с каждым изменением; этот суффикс спас больше развертываний, чем история отмены любого редактора.
- Разделители бесплатны: s|/var/www|/srv/app|g (или s#...#g) позволяет избежать драк с косой чертой, когда ваш шаблон полон путей.
- -i не является атомарным: сбой или неправильное регулярное выражение в середине пакета однажды оставили наполовину переписанные файлы, поэтому массовые задания выполняются с копиями или отслеживаемыми git деревьями, а не с единственной копией.
- GNU и BSD sed расходятся во мнениях по поводу -i: BSD требует суффикс перед сценарием (sed -i '' работает в macOS, это не синтаксис Linux), что является еще одной причиной, по которой сценарии переносимости полностью избегают -i.
- Удалить и изолировать — честные глаголы: 'd' удаляет совпадающие строки (sed '/^#/d' удаляет комментарии), а -n с диапазоном изолирует раздел; оба читаются лучше, чем умные замены.
- Все, что находится за пределами однострочных изменений, буквальных многострочных блоков или соединений с сохранением состояния, принадлежит awk или реальному скрипту; принуждение sed к работе программиста приводит к рождению нечитаемых однострочников.
Заметка из практики
Мой первый sed -i без суффикса .bak попал в рабочую конфигурацию nginx прямо перед дневным пиком трафика. С тех пор каждое редактирование на месте сопровождается суффиксом резервной копии, и я читаю выходные данные пробного прогона еще до того, как -i даже приближается к команде.
Частые вопросы
Как редактировать только строки, которые соответствуют чему-то еще?
Обратитесь к ним: sed '/cache/s/true/false/' меняет значение true на false только в строках кэша и ограничивает изменения области действия, например '/<VirtualHost>/,/<\/VirtualHost>/s/Old/New/g', до блоков; адрес идет первым, команда – вторым.
Почему sed не соответствует концам строк в файле, редактируемом Windows?
Эти строки заканчиваются символами возврата каретки, которых не ожидают привязки '$'; сначала удалите их с помощью tr или нормализуйте по пути, и многострочный контент по-прежнему будет принадлежать awk или Perl с -0777.
Sed быстрее, чем awk, для простых замен?
Незначительно и несущественно; оба завершаются за миллисекунды для файлов размера конфигурации. Выбирайте по читабельности, ведь коллеге за полгода предстоит разобрать вашу остроту.
Могу ли я вставлять целые блоки конфигурации с помощью sed?
Да: «a» добавляется после, «i» вставляется перед, а «c» заменяет строку, но сохраняйте вставленный текст простым и одноцелевым; реальные блоки принадлежат файлу шаблона или правильному этапу подготовки.
Как мы берём на себя команды linux и навыки работы с оболочкой
Договорились: Команды и сценарии сценариев, которые решают, управляет ли администратор сервером или борется с ним: поиск, преобразование, передача и контроль текста и процессов с помощью инструментов, которые есть в каждой базовой установке. Передайте это нашей услуге Безопасность серверов Linux и Администрирование серверов — вопрос будет закрыт, оценён по делу, внедрён без лишних движений и под наблюдением круглосуточно.