Альтернатива "sed -i" на Solaris
В Linux sed -i
изменит входные файлы на месте. Однако он не работает на Solaris.
sed -i '$ s/OLD/NEW/g' test
sed: illegal option -- i
Что я могу использовать вместо sed -i
в Solaris?
Ответы
Ответ 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
содержит несколько строк с одной строкой в строке.