Чаще всего sed «не работает» по одной из трёх причин: неправильно экранированы спецсимволы в регулярном выражении, используется синтаксис GNU sed на системе с BSD-версией (или наоборот), либо файл не меняется из-за отсутствия флага -i или прав на запись. Ниже — как отличить эти случаи и починить каждый.
Sed ничего не заменяет
Если команда отрабатывает без ошибок, но файл остаётся прежним, проверьте три вещи. Во-первых, слэши и точки в путях и доменах нужно экранировать обратным слэшем или брать другой разделитель, например sed ‘s|old|new|g’ вместо sed ‘s/old/new/g’ — это снимает половину проблем с экранированием. Во-вторых, регистр и пробелы: sed ищет строку буквально, лишний пробел или другой регистр — и совпадения не будет. В-третьих, кодировка файла: если в исходнике UTF-8 с BOM или другая кодировка, шаблон в UTF-8 может не совпасть с байтами файла.
Ошибка «unterminated s command» или «invalid command code»
Такая ошибка почти всегда означает конфликт версий. На macOS по умолчанию стоит BSD sed, у него другой синтаксис для флага -i: нужно писать sed -i » ‘s/a/b/g’ file с пустым аргументом после -i, тогда как в GNU sed (стандартный Linux) достаточно sed -i ‘s/a/b/g’ file. Если скрипт писался под Linux, а запускается на Mac (или наоборот), первым делом проверяйте именно этот флаг.
Как проверить, что происходит, перед тем как что-то менять
- Сначала выполните команду без -i — sed по умолчанию выводит результат в консоль, не трогая файл, так можно безопасно проверить шаблон.
- Сделайте резервную копию файла перед массовой заменой: cp file file.bak.
- Если меняете конфиг сервера или .htaccess, перезапустите сервис после правки — иначе изменения не применятся, даже если sed отработал верно.
Если после замены сайт стал работать не так, как ожидалось (пропали редиректы, слетела кодировка), верните файл из резервной копии и вносите изменения точечно, через текстовый редактор, а не массовым sed-скриптом.
Если ни один из вариантов не помог и sed продолжает выдавать ошибку на, казалось бы, корректной команде, проверьте версию утилиты: sed —version. Отсутствие вывода версии обычно и означает, что перед вами BSD-реализация, а не GNU, и синтаксис нужно подстраивать под неё.