Я хочу отредактировать файл с помощью 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
-i
флаг?Ответы:
Вы можете
-i
правильно использовать флаг, добавив к нему суффикс к файлу резервной копии. Расширение вашего примера:Вы получите два файла: один с именем
file1.txt
, содержащим подстановку, и один с именемfile1.txt.bu
, имеющим исходное содержимое.Умеренно опасно
Если вы хотите разрушительно перезаписать исходный файл, используйте что-то вроде:
Из-за способа анализа строки между флагом опции и ее аргументом требуется пробел, потому что аргумент имеет нулевую длину.
За исключением возможного уничтожения вашего оригинала, я не знаю о каких-либо других опасностях обмана sed таким образом. Однако следует отметить, что, если этот вызов
sed
является частью сценария, The Unix Way ™ (IMHO) должен использоватьsed
неразрушающий контроль, проверить, что он завершился правильно, и только затем удалить посторонний файл.источник
-i''
Опасно ли это по какой-либо причине, кроме потенциально испорченного исходного файла (и отсутствия резервной копии)?sed
странице руководства, если у вас закончится дисковое пространство на устройстве, вы можете повредить файл на полпути и получить плохой результат. Если вы работаете с локальным контролемsed -i ""
версий без резервных копий, все должно быть в порядке большую часть времени (или непосредственноgit init && git add -A . && git commit -m 'backup'
перед запуском sed в-i
режиме).-i''
действительно, но-i ''
это не так.У меня аналогичная проблема с MacOS
не работает, но
работает хорошо.
источник
sed -i '' <file>
работает, ноsed -i'' <file>
больше не работаетисточник
Вы можете использовать
-i''
(--in-place
)sed
как уже было предложено. См: на месте аргумента , однако обратите внимание , что вариант нестандартных расширений FreeBSD и могут быть недоступны в других операционных системах. Во-вторых , это S tream ED itor , а не файловый редактор .-i
-i
sed
Альтернативный способ - использовать встроенную замену в режиме Vim Ex, например:
и для нескольких файлов:
Для рекурсивного редактирования всех файлов вы можете использовать,
**/*.*
если оболочка поддерживает это (включитьshopt -s globstar
).Другой способ - использовать
gawk
его новое расширение "inplace", например:источник
Это создает файлы резервных копий. Например,
sed -i -e 's/hello/hello world/' testfile
для меня создает файл резервной копии testfile-e в том же каталоге.источник
Ты можешь использовать:
sed -i -e 's/<string-to-find>/<string-to-replace>/' <your-file-path>
Пример:
sed -i -e 's/Hello/Bye/' file.txt
Это работает безупречно на Mac .
источник
-i
требуется аргумент для macOS. Поскольку вы не указываете один, он использует-e
, в результате чего получается второй файл с-e
добавленным.-e
не существует в macOS, это так-E
. Итак, правильная команда для macOSsed -i '' -E 's/Hello/Bye/' file.txt