Редактирование на месте с помощью sed в OS X - PullRequest
119 голосов
/ 27 сентября 2011

Я бы хотел отредактировать файл с помощью 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

Ответы [ 6 ]

236 голосов
/ 27 сентября 2011

Вы можете правильно использовать флаг -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 является частью сценария, то Unix Way ™ (IMHO) будет использовать sed неразрушающим образом, проверять, что он завершился чисто, и только затем удалитьпосторонний файл.

15 голосов
/ 19 июня 2014

У меня похожая проблема с MacOS

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

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

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

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

3 голосов
/ 25 июля 2018

Вы можете использовать:

sed -i -e 's/<string-to-find>/<string-to-replace>/' <your-file-path>

Пример:

sed -i -e 's/Hello/Bye/' file.txt

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

3 голосов
/ 19 апреля 2015

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


Альтернативный способ - использовать встроенную замену в режиме Vim Ex, например:

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

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

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

Для рекурсивного редактирования всех файлов вы можете использовать **/*.*, если это поддерживается оболочкой (включите с помощью shopt -s globstar).


Другим способом является использование gawk и его нового внутреннего расширения , такого как:

$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1
2 голосов
/ 09 мая 2018
sed -i -- "s/https/http/g" file.txt
1 голос
/ 10 августа 2018

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

...