Sed в AIX не распознает флаг -i - PullRequest
7 голосов
/ 29 августа 2011

Работает ли sed -i в AIX?

Если нет, как я могу отредактировать файл "на месте" в AIX?

Ответы [ 6 ]

14 голосов
/ 29 августа 2011

Опция -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' .

2 голосов
/ 27 сентября 2017
#!/bin/ksh
host_name=$1
perl -pi -e "s/#workerid#/$host_name/g" test.conf 

Выше будет заменено # workerid # на $ host_name внутри test.conf

1 голос
/ 13 апреля 2012

Вы можете просто установить GNU-версию команд Unix в AIX:

http://www -03.ibm.com / systems / power / software / aix / linux / toolbox / alpha.html

0 голосов
/ 20 ноября 2015

вы можете использовать Perl для этого:

perl -p -i.bak -e 's/old/new/g' test.txt

собирается создать файл .bak.

0 голосов
/ 18 апреля 2015

Другой вариант - использовать старый добрый ed, например:

ed fileToModify <<EOF
,s/^ff/gg/
w
q
EOF
0 голосов
/ 30 марта 2015

Вы можете использовать здесь конструкцию с vi:

vi file >/dev/null 2>&1 <<@
:1,$ s/old/new/g
:wq
@

Если вы хотите что-то делать в режиме vi-edit, вам понадобится ESC.
Для ESC нажмите CTRL-V ESC.
Когда вы используете это в неинтерактивном режиме, vi может жаловаться на то, что TERM не установлен. Решение добавляет export TERM=vt100 перед вызовом vi.

...