Опция -i
является расширением GNU (нестандартного) для команды sed
. Это не было частью классического интерфейса к sed
.
Вы не можете редактировать in situ непосредственно в AIX. Вы должны сделать эквивалент:
sed 's/this/that/' infile > tmp.$$
mv tmp.$$ infile
Вы можете обрабатывать только один файл за один раз, тогда как опция -i
позволяет вам достичь результата для каждого из множества файлов в его списке аргументов. Опция -i
просто упаковывает эту последовательность событий. Это, несомненно, полезно, но это не стандарт.
Если вы написали этот сценарий, вам нужно подумать, что произойдет, если команда прервется; в частности, вы не хотите оставлять временные файлы. Это приводит к чему-то вроде:
tmp=tmp.$$ # Or an alternative mechanism for generating a temporary file name
for file in "$@"
do
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
sed 's/this/that/' $file > $tmp
trap "" 0 1 2 3 13 15
mv $tmp $file
done
Удаляет временный файл, если сигнал (HUP, INT, QUIT, PIPE или TERM) возникает во время работы sed
. Как только sed
завершен, он игнорирует сигналы, пока происходит mv
.
Вы все еще можете улучшить это, выполнив такие вещи, как создание временного файла в том же каталоге, что и исходный файл, вместо того, чтобы потенциально сделать файл в совершенно другой файловой системе.
Другое усовершенствование - разрешить указание команды (sed 's/this/that'
в примере) в командной строке. Это становится сложнее!
Вы можете найти команду overwrite
(shell), которую Керниган и Пайк описывают в своей классической книге 'Среда программирования UNIX' .