Флаг sed in-place, который работает как на Mac (BSD), так и на Linux - PullRequest
201 голосов
/ 17 апреля 2011

Есть ли вызов sed редактирования на месте без резервного копирования, который работает как в Linux, так и в Mac? В то время как BSD sed, поставляемый с OS X, похоже, требуется sed -i '' …, дистрибутивы GNU sed Linux обычно поставляются с интерпретацией кавычек как пустого имени входного файла (вместо расширения резервной копии), и вместо него требуется sed -i ….

Существует ли какой-либо синтаксис командной строки, который работает с обоими вариантами, поэтому я могу использовать один и тот же сценарий в обеих системах?

Ответы [ 13 ]

1 голос
/ 21 июля 2017

Я столкнулся с этой проблемой.Единственным быстрым решением было заменить sed в Mac на версию GNU:

brew install gnu-sed
0 голосов
/ 19 апреля 2016

В Linux и OS X у меня работает следующее:

sed -i' ' <expr> <file>

например. для файла f, содержащего aaabbaaba

sed -i' ' 's/b/c/g' f

возвращает aaaccaaca как в Linux, так и в Mac. Обратите внимание, что есть строка в кавычках, содержащая пробел , с без пробела между -i и строкой. Работают одинарные или двойные кавычки.

В Linux я использую bash версию 4.3.11 под Ubuntu 14.04.4 и на Mac версии 3.2.57 под OS X 10.11.4 El Capitan (Darwin 15.4.0).

0 голосов
/ 06 августа 2013

Вы можете использовать губку. Sponge - это старая Unix-программа, находящаяся в пакете moreutils (как в ubuntu и, вероятно, в debian, так и в homebrew в mac).

Он будет буферизовать весь контент из канала, дождаться закрытия канала (возможно, это означает, что входной файл уже закрыт), а затем перезаписать:

со страницы руководства :

Синопсис

sed '...' file | grep '...' | губка

...