Получена ошибка: sed: недопустимая опция — i?

Вопрос или проблема

$ 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, как это было показано в приведенном примере. Вот пошаговая инструкция для выполнения данной операции:

  1. Поиск файлов: Используйте команду find для поиска всех файлов в нужной директории.

    find . -type f

    Этот шаг позволяет сгенерировать список всех файлов в текущем каталоге и его подкаталогах.

  2. Замену строк с использованием 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" во всех найденных файлах.

  3. Проверка результата: Убедитесь, что замена строк прошла успешно. Можно использовать grep для проверки наличия старых и новых строк в файлах.

    grep -r 'string_to_be_replace' .

Заключение:
Ошибка "sed: illegal option — i" в SunOS указывает на несовместимость использованных опций с возможностями sed в данной системе. Использование Perl является эффективной альтернативой для достижения той же цели — инлайн-редактирования файлов. Его поддержка на большинстве UNIX-систем делает этот инструмент универсальным решением в сценариях, когда GNU инструменты могут быть недоступны или в случае ограничений, накладываемых системой. Производя замену с помощью этого подхода, вы сможете сохранить производительность и корректность ваших задач автоматизации на серверной стороне.

Оцените материал
Добавить комментарий

Капча загружается...