Поиск…


Синтаксис

  • 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

(такой раздел появляется во всех текущих руководствах 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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow