sed
Редактирование на месте
Поиск…
Синтаксис
- sed -I extension - FreeBSD sed (непрерывный линейный счетчик)
- sed -I [ расширение ] - NetBSD и Illumos sed (непрерывный линейный счетчик)
- sed -i extension - команда FreeBSD
- sed -i [ расширение ] - NetBSD, OpenBSD, Illumos, BusyBox и GNU sed
- sed - in-place [= extension ] - Illumos, BusyBox и GNU sed
параметры
параметр | подробности |
---|---|
extension | Сохраните файл резервной копии с указанным расширением или нет файла резервной копии, если extension является строкой нулевой длины. |
замечания
Редактирование на месте - это распространенное, но нестандартное расширение, присутствующее в большинстве последних систем.
(такой раздел появляется во всех текущих руководствах BSD sed
и их производных)
Не рекомендуется указывать расширение нулевой длины при редактировании файлов, поскольку это может привести к повреждению или частичному контенту в ситуациях, когда дисковое пространство исчерпано и т. Д.
Не забывайте, что могущественный ed
Разумеется, для sed
и для редактирования на месте используются sed
, но когда стандарт UNIX расширяется, мы всегда должны спрашивать, почему старый стандарт UNIX не включил эту функцию. Хотя UNIX не совершенен, ортогональность и полнота инструментов были разработаны настолько близко к совершенству, по крайней мере, для целей, которые были видны в 1970 году: редактирование текста и автоматическое редактирование текста были наверняка видны в это время.
На самом деле идея sed
заключается не в редактировании файла на месте, а в редактировании потока . Вот почему имя sed
является коротким редактором потока . Уберите s
, и вы получите инструмент, который был фактически предназначен для редактирования файлов : ed
:
printf 'g/what to replace/s//with what to replace/g\nw\nq\n' | ed file
или cat file_edit_commands | ed file
.
Замена строк в файле на месте
sed -i s/"what to replace"/"with what to replace"/g $file
Мы используем -i
для выбора редактирования на месте в $file
file. В некоторых системах требуется добавить суффикс после флага -i
который будет использоваться для создания резервной копии исходного файла. Вы можете добавить пустую строку как -i ''
чтобы опустить создание резервной копии. Посмотрите на примечания в этом разделе о опции -i
.
Терминатор g
означает глобальную находку / замену в каждой строке.
$ cat example
one
two
three
total
$ sed -i s/"t"/"g"/g example
$ cat example
one
gwo
ghree
gogal
Портативное использование
Редактирование на месте, хотя и является общим, является нестандартной функцией. Жизнеспособной альтернативой было бы использовать промежуточный файл для хранения оригинала или вывода.
sed 'sed commands' > file.out && mv file.out file
# or
mv file file.orig && sed 'sed commands' file.orig > file
Чтобы использовать параметр -i
как с синтаксисом GNU, так и с FreeBSD, необходимо указать расширение и добавить его в параметр -i
. Следующее будет принято обоими и создаст два файла, оригинальную версию в file.orig
и отредактированную версию в file
:
sed -i.orig 'sed commands' file
См. Базовый пример с файлом file
:
$ cat file
one
two
three
$ sed -i.orig 's/one/XX/' file
$ cat file # the original file has changed its content
XX
two
three
$ cat file.orig # the original content is now in file.orig
one
two
three
Более сложный пример, заменяющий каждую строку номером строки:
$ printf 'one\ntwo\n' | tee file1 | tr a-z A-Z > file2
$ sed -ni.orig = file1 file2
$ cat file1.orig file2.orig
one
two
ONE
TWO
$ cat file1 file2
1
2
1
2
Зачем нужен резервный файл
Для того , чтобы использовать в месте редактирования без файла резервной копии, -i
необходим дать нулевую длину аргумент а и FreeBSD sed
требует аргумента -i
, либо добавляются или отдельно, в то время как дополнительный аргумент расширение GNU требует аргумент дополнить -i
. Оба поддерживают добавление аргумента к -i
, но без необходимости -i'' command
неотличим от -i extension
, поэтому аргумент нулевой длины не может быть добавлен к -i
.
Редактирование на месте без указания файла резервной копии переопределяет разрешения только для чтения
sed -i -e cmd file
будет изменять file
даже если его разрешения установлены только для чтения.
Эта команда ведет себя аналогично
sed -e cmd file > tmp; mv -f tmp file
скорее, чем
sed -e cmd file > tmp; cat tmp > file; rm tmp
В следующем примере используется gnu sed
:
$ echo 'Extremely important data' > input
$ chmod 400 input # Protect that data by removing write access
$ echo 'data destroyed' > input
-bash: input: Permission denied
$ cat input
Extremely important data (#phew! Data is intact)
$ sed -i s/important/destroyed/ input
$ cat input
Extremely destroyed data (#see, data changed)
Это можно смягчить, создав резервную копию, указав SUFFIX
с опцией i
:
$ sed -i.bak s/important/destroyed/ input
$ cat input
Extremely destroyed data
$ cat input.bak
Extremely important data