вариант sed-i не работает на Солярисе


Я использую sed для замены строки в файле на NULL. Я использовал команду

sed -i "s/.*shayam.*//g" FILE

Это прекрасно работает в linux. shayam заменяется пустым в файле. Но когда я использовал это в solaris, он показывает некоторую ошибку.

Sed: незаконный вариант -- i

Как использовать-I функциональность sed в solaris. Пожалуйста, помогите.

4 9

4 ответа:

Опция -i специфична для GNU. Версия Solaris не поддерживает эту опцию.

Вам нужно будет установить версию GNU или переименовать новый файл поверх старого:

sed 's/.shayam.//g' FILE > FILE.new && mv FILE.new FILE

Я только что ответил на аналогичный вопрос sed-i + что такое же опция в SOLARIS , но для тех, кто находит этот поток вместо этого (я видел его в соответствующем разделе потока):

Основная проблема, которую я вижу в большинстве ответов, заключается в том, что он не работает, если вы хотите изменить несколько файлов. Ответ я дал в другом потоке:
Это не совсем то же самое, что sed-i, но у меня была похожая проблема. Вы можно сделать это с помощью perl:
perl -pi -e 's/find/replace/g' file

Только копирование / перемещение работает для отдельных файлов. если вы хотите замените некоторый текст через каждый файл в каталоге и подкаталоги, вам нужно что-то, что делает это на месте. вы можете сделать это с perl и находим:

find . -exec perl -pi -e 's/find/replace/g' '{}' \;

sed не имеет опции -i .

Вы, вероятно, используете какой-то конкретный для поставщика Вариант sed. Если вы хотите использовать нестандартизированные расширения конкретного поставщика вашего нестандартизированного варианта sed, вам нужно убедиться, что вы установили указанный нестандартизированный вариант поставщика и должны убедиться, что вы вызываете it и не вызываете соответствующую стандартам версию sed, которая является частью вашей операционной системы. окружающая среда.

Обратите внимание, что, как и всегда при использовании нестандартизированных расширений для конкретных поставщиков, нет абсолютно никакой гарантии, что ваш код будет переносимым, что именно является проблемой, которую вы видите. Однако в данном конкретном случае есть гораздо лучшее решение: используйте правильный инструмент для работы. sed - это редактор потоков (поэтому он называется "sed"), то есть он предназначен для редактирования потоков, а не файлов. Если вы хотите редактировать файлы, используйте файл редактор , например ed:
ed FILE <<-HERE
  ,s/.shayam.//g
  w
  q
HERE

См. также:

Либо cat файл, либо попробовать <? Затем передайте (|) результат во временный файл, и если все пойдет хорошо (&&) mv tempfile к исходному файлу.

Пример:

cat my_file | sed '!A!B!' > my_temp_file && mv my_temp_file my_file