Я'м пишу скрипты на моем сервере, который является хостинга под управлением FreeBSD. Я также хочу быть в состоянии проверить их локально, на моем компьютере с ОС Linux. Следовательно, я'м пытаюсь написать их в портативный путь, но с СЭД
я не вижу способа сделать это.
Часть Мой сайт использует созданные статические HTML-файлы, и эта седьмая линия вставляет правильно установлен после каждой регенерации:
sed -i '1s/^/<!DOCTYPE html> \n/' ${file_name.html}
Он работает с GNU СЭД
на Linux, а для FreeBSD-Current функциональности sed
ожидает, что первый аргумент после опции-i` быть расширение для резервного копирования. Вот как это будет выглядеть:
sed -i '' '1s/^/<!DOCTYPE html> \n/' ${file_name.html}
Однако, ГНУ СЭД
, в свою очередь, предполагает выражение непосредственно после -я
.
(Это также требует исправления с новой строки обращения, но, что's уже ответил В здесь)
Конечно, я могу включить это изменение в моем сервере копию сценария, но это будет бардак, т. е. использование виртуальных каналов для управления версиями. Есть ли способ достичь этого с помощью sed в полностью переносимым способом?
В GNU СЕПГ принимает необязательный расширение после -я
. Расширения должны быть в том же аргумент без пробелов. Этот синтаксис также работает на BSD СЭД.
sed -i.bak -e '…' SOMEFILE
Обратите внимание, что на BSD, но также изменяет поведение при наличии нескольких входных файлов: они обрабатываются независимо друг от друга (так например, $
соответствует последней строке каждого файла). Также это выиграл't работа на С busybox.
Если вы Don'т хотите использовать для резервного копирования файлов, вы могли бы проверить, какая версия СЭД доступна.
case $(sed --help 2>&1) in
*GNU*) set sed -i;;
*) set sed -i '';;
esac
"$@" -e '…' "$file"
Или в качестве альтернативы, чтобы избежать удалив позиционные параметры, определить функцию.
case $(sed --help 2>&1) in
*GNU*) sed_i () { sed -i "$@"; };;
*) sed_i () { sed -i '' "$@"; };;
esac
sed_i -e '…' "$file"
Если вы Don'т хотите заморачиваться, использовать Perl.
perl -i -pe '…' "$file"
Если вы хотите написать переносимый скрипт, Дон'т использовать -я
— это'т в POSIX. Делать вручную то, что СЭД не под капотом — его's только одна строка кода.
sed -e '…' "$file" >"$file.new"
mv -- "$file.new" "$file"
Если вы Don'т найти трюк, чтобы сделать СЭД
играть хорошо, вы могли бы попробовать:
я
: СЭД '1С/^/<!Элемент DOCTYPE в HTML> \Н/' что "${file_name.html}" и > на "${file_name.html}.ТМП" и &АМП;& МВ " и${file_name.html}.ТМП-то" на "${file_name.html}"и
на Perl -я -Пе 'принт " и<!Элемент DOCTYPE в HTML и GT; \П" если $.==1;' я; &и"${file_name.html}&;
Вы всегда можете использовать Эд
, чтобы добавить строку в существующий файл.
$ printf '0a\n<!DOCTYPE html>\n.\nw\n' | ed my.html
Детали ###
Биты вокруг в <!Элемент DOCTYPE в HTML>
команды Ред
наставляя его, чтобы добавить эту строку в my.html файл``.
Я считаю, что эта команда в СЭД
также могут быть использованы:
$ sed -i '1i<!DOCTYPE html>\n` testfile.csv
Вы также можете это сделать вручную, что на Perl -я тут под капотом:
{ rm -f file && { echo '<!DOCTYPE html>'; cat; } > file;} < file
Как `перл-я, там's нет резервного копирования, и, как большинство решений, приведенных здесь, будьте осторожны, это может повлиять на разрешения владельца файла можно сделать символическую ссылку на обычный файл.
С:
sed '1i\
<!DOCTYPE html>' file 1<> file
ООО
будет перезаписывать файл над собой, никак не повлияет на право собственности и разрешений и символические ссылки. Он работает с GNU СЭД
, потому что СЭД
, как правило, имеют прочитать полный буфер данных из файла (4К в моем случае) до его перезаписи с приказываю
. Что бы'т работать, если файл был более 4к за исключением того, что СЭД
также буферов его выход.
В основном СЭД
работает на блоках 4К для чтения и записи. Если строка для вставки меньше, чем 4К, СЭД
никогда не будет перезаписывать блок, он не читал.
Я бы'т рассчитывать на то.
Во FreeBSD в <а href="и https://github.com/freebsd/freebsd/tree/master/usr.bin/sed">СЭД</а>, который используется в Mac ОС X, а также, потребности в <код>-е</код> параметр после в <код>-я&л;/код> переключатель, чтобы определить & признать следующую (регулярное выражение) команда правильно & однозначно.
Другими словами, в <код>сед-и-Е ...</код> должен работать с и FreeBSD & GNU вместе <код>В ООО</код>.
В целом, опуская резервного копирования расширений после FreeBSD <код>сед-я&л;/код> требует каких-то явных на <код>В ООО</код> параметр или переключатель после на <код>-я&л;/код>, Чтобы избежать путаницы с частью FreeBSD в <код>В ООО</код> при анализе ее аргументы командной строки.
(Заметим, однако, что в <код>ООО</код> в-места изменения приводят к inode файла изменения, см. <а href="http://backreference.org/2011/01/29/in-place-editing-of-files/">"In-place" редактирование файлов</а>).
(В общем намекаю, последние версии FreeBSD на <код>В ООО</код> есть в <код> По-Р</код> переключатель для повышения совместимости с GNU вместе <код>В ООО</код и GT;).
echo a > testfile.txt
ls -li testfile.txt
#gsed -i -e 's/a/A/' testfile.txt
#bsdsed -i 's/a/A/' testfile.txt # does not work
bsdsed -i -e 's/a/A/' testfile.txt
ls -li testfile.txt
cat testfile.txt
Подражать-Current функциональности sed -i
для одного файла портабельно, избегая, насколько возможно, условия гонки:
sed 'script' <<FILE >file
$(cat file)
FILE
Кстати, это также отвечает за возможные проблемы, которые СЭД -меня вводит в, что, в зависимости от разрешения для файлов и каталогов,
сед-я может позволить пользователю, чтобы перезаписать файл, который пользователь не имеет прав на редактирование.
Вы также можете делать резервные копии, как:
sed 'script' <<FILE >file
$(tee file.old <file)
FILE
Вы можете использовать Vim в режиме Ex:
ex -sc '1i|<!DOCTYPE html>' -cx file
1
Выберите первую строку
" я " вставить текст и перевод строки
" х " сохранить и закрыть
Или даже, как в комментариях, обычная старая standard бывших
:
printf '%s\n' 1i '<!DOCTYPE html>' . x | ex file