Альтернатива `sed -i` на Солярисе - PullRequest
27 голосов
/ 26 августа 2010

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

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

Что можно использовать вместо sed -i в Solaris?

Ответы [ 3 ]

23 голосов
/ 30 ноября 2010

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

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

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

find . -exec perl -pi -e 's/find/replace/g' '{}' \;
20 голосов
/ 26 августа 2010

Вам нужно будет самому повторить поведение -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"
0 голосов
/ 06 декабря 2018

Еще одна команда «одна строка», которая работает на хосте 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 содержит несколько строк, по одной строке на строку.

...