На месте редактирования с 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 в том же каталоге.