Подтвердить что ты не робот

Альтернатива "sed -i" на Solaris

В Linux sed -i изменит входные файлы на месте. Однако он не работает на Solaris.

sed -i '$ s/OLD/NEW/g' test        
sed: illegal option -- i

Что я могу использовать вместо sed -i в Solaris?

4b9b3361

Ответ 1

Вам нужно будет реплицировать поведение -i, сохраняя результаты в временном файле, а затем заменяя исходный файл временным файлом. Это может показаться неэлегантным, но все sed -i делает под обложками.

sed '$ s/OLD/NEW/g' test > test.tmp && cat test.tmp > test && rm test.tmp

Если вам все равно, вы можете сделать его более надежным, используя mktemp:

tmp=$(mktemp test.XXXXXX)
sed '$ s/OLD/NEW/g' test > "$tmp" && cat "$tmp" > test && rm "$tmp"

Ответ 2

Это не совсем то же самое, что и sed -i, но у меня была аналогичная проблема. Вы можете сделать это с помощью perl:

perl -pi -e 's/find/replace/g' file

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

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

Ответ 3

Еще одна команда "одна строка", которая работает на хосте Solaris 11 в среде bash:

for i in 'cat strings_to_delete.txt'
do 
    sed "/$i/d" file.to_edit.txt > file.edited.txt &&
        mv file.edited.txt file.to_edit.txt
done

Он удаляет строки из файла strings_to_delete.txt в file.to_edit.txt. Файл strings_to_delete.txt содержит несколько строк с одной строкой в строке.