На месте редактирования с sed на OS X

Я хотел бы отредактировать файл с sed в OS X. Я использую следующую команду:

sed 's/oldword/newword/' file.txt

Выход отправляется на терминал. file.txt не изменяется. Изменения сохраняются в file2.txt с помощью этой команды:

sed 's/oldword/newword/' file1.txt > file2.txt

Однако я не хочу другого файла. Я просто хочу отредактировать file1.txt. Как я могу это сделать?

Я пробовал флаг -i. Это приводит к следующей ошибке:

sed: 1: "file1.txt": invalid command code f

Ответ 1

Вы можете правильно использовать флаг -i, предоставив ему суффикс для добавления в резервный файл. Расширение вашего примера:

sed -i.bu 's/oldword/newword/' file1.txt

Предоставит вам два файла: один с именем file1.txt, который содержит подстановку, и один с именем file1.txt.bu, который имеет исходное содержимое.

Легко опасный

Если вы хотите разрушить исходный файл, используйте что-то вроде:

sed -i '' 's/oldword/newword/' file1.txt
      ^ note the space

Из-за того, как линия анализируется, между флажком опциона и его аргументом требуется пространство, потому что аргумент имеет нулевую длину.

Помимо возможного разрушения вашего оригинала, я не знаю о каких-либо дальнейших опасностях обманывать этот способ. Следует отметить, однако, что если этот вызов sed является частью script, Unix Way ™ будет (IMHO) использовать sed неразрушающим образом, проверить, что он вышел из строя, и только тогда удалите посторонний файл.

Ответ 2

У меня аналогичная проблема с MacOS

sed -i '' 's/oldword/newword/' file1.txt

не работает, но

sed -i"any_symbol" 's/oldword/newword/' file1.txt

работает хорошо.

Ответ 3

Вы можете использовать -i'' (--in-place) для sed, как уже было предложено. Смотрите: Аргумент -i на месте, однако обратите внимание, что параметр -i является нестандартным расширением FreeBSD и может быть недоступен в другие операционные системы. Во-вторых sed - это S tream ED itor, а не редактор файлов.


Альтернативным способом является использование встроенной подстановки в режиме Vim Ex, например:

$ ex +%s/foo/bar/g -scwq file.txt

и для нескольких файлов:

$ ex +'bufdo!%s/foo/bar/g' -scxa *.*

Чтобы отредактировать все файлы рекурсивно, вы можете использовать **/*.*, если оболочка поддерживает это (enable by shopt -s globstar).


Другой способ - использовать gawk и его новый "inplace" extension, например:

$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1

Ответ 4

ты можешь использовать,

sed -i -e 's///'

Например, sed -i -e 's/Hello/Bye/' file.txt

это работает безупречно в Mac

Ответ 5

sed -i -- "s/https/http/g" file.txt

Ответ 6

Это создает файлы резервных копий. Например, sed -i -e 's/hello/hello world/' testfile для меня создает файл резервной копии testfile-e в том же каталоге.