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