Вопрос или проблема
$ find . -type f -exec sed -i 's/original_string/tobereplace_string/g' {} +
sed: illegal option -- i
здесь я заменяю строку с помощью вышеуказанной команды, но получаю ошибку illegal option — i
можете, пожалуйста, сообщить, в чем здесь проблема
ПРИМЕЧАНИЕ: я выполняю вышеуказанную команду в UNIX
, ниже представлена версия
SunOS Hostname 5.10 Generic_150400-34 sun4u sparc SUNW,Sun-Fire-V890
Согласно мануалу Solaris 10 sed страница -i
не является допустимой опцией для sed.
Для использования sed в режиме inline, см. https://stackoverflow.com/questions/3576380/sed-i-what-the-same-option-in-solaris
find . -type f|xargs perl -pi -e 's/original_string/string_to_be_replace/g'
.
Ответ или решение
Введение:
При работе с утилитой sed
на UNIX-системах можно столкнуться с проблемой использования опции -i
, что приводит к ошибке "illegal option — i". В данном контексте речь идет о системе SunOS 5.10, где версия sed
не поддерживает опцию -i
, которая обычно используется для модификации файлов на месте (инлайн-редактирование). В этой статье мы подробно рассмотрим проблему, примеры ее решения и предложим применение альтернативных подходов.
Теория:
В большинстве GNU-совместимых систем Linux, использование утилиты sed
с опцией -i
(короткая форма для "inline") позволяет напрямую изменять файл, заменяя определенные строки. Однако, в традиционных UNIX-системах, таких как SunOS, такой опции может не быть, так как она является специфичной для GNU sed
.
Это связано с тем, что оригинальная версия утилиты sed
, разработанная для UNIX, не предусматривала возможность изменения файлов на месте. Вместо этого, стандартное поведение sed
предполагает получение ввода, обработку данных согласно указанным паттернам, и вывод результатов в стандартный поток вывода, оставляя оригинальный файл неизменным.
Пример:
Рассмотрим пример команды, вызвавшей ошибку:
find . -type f -exec sed -i 's/original_string/tobereplace_string/g' {} +
Эта команда пытается найти все файлы в текущем каталоге и заменить в них строку "original_string" на "tobereplace_string", используя опцию -i
для инлайн-редактирования. Однако, в SunOS, эта опция отсутствует.
Использование Perl в качестве альтернативы:
Чтобы обойти ограничение, связанное с отсутствием поддержки опции -i
в sed
, можно воспользоваться утилитой Perl, которая позволяет редактировать файлы на месте с аналогичной функциональностью.
Пример решения выглядит следующим образом:
find . -type f | xargs perl -pi -e 's/original_string/string_to_be_replace/g'
Здесь perl -pi -e
выполняет ту же функцию инлайн-редактирования, что и sed -i
, заменяя вхождения строки "original_string" на "string_to_be_replace" во всех найденных файлах. Этот подход поддерживается на большом количестве систем UNIX, включая SunOS, что делает его практичной альтернативой в условиях ограниченного функционала sed
.
Реализация:
Если необходимо заменить строки в большом количестве файлов на SunOS-системе, рекомендуется использовать Perl, как это было показано в приведенном примере. Вот пошаговая инструкция для выполнения данной операции:
-
Поиск файлов: Используйте команду
find
для поиска всех файлов в нужной директории.find . -type f
Этот шаг позволяет сгенерировать список всех файлов в текущем каталоге и его подкаталогах.
-
Замену строк с использованием Perl: Передайте результаты команды
find
в утилитуperl
через командуxargs
.find . -type f | xargs perl -pi -e 's/original_string/string_to_be_replace/g'
Такой подход гарантирует, что все вхождения "original_string" будут заменены на "string_to_be_replace" во всех найденных файлах.
-
Проверка результата: Убедитесь, что замена строк прошла успешно. Можно использовать
grep
для проверки наличия старых и новых строк в файлах.grep -r 'string_to_be_replace' .
Заключение:
Ошибка "sed: illegal option — i" в SunOS указывает на несовместимость использованных опций с возможностями sed
в данной системе. Использование Perl является эффективной альтернативой для достижения той же цели — инлайн-редактирования файлов. Его поддержка на большинстве UNIX-систем делает этот инструмент универсальным решением в сценариях, когда GNU инструменты могут быть недоступны или в случае ограничений, накладываемых системой. Производя замену с помощью этого подхода, вы сможете сохранить производительность и корректность ваших задач автоматизации на серверной стороне.