Как использовать GNU sed в Mac OS X
Под Mac OS 10.10.3 я установил gnu-sed, набрав:
brew install gnu-sed --default-names
Когда я набираю это снова, я получаю сообщение:
gnu-sed-4.2.2 уже установлена
Однако даже после перезагрузки системы и перезапуска Терминала я все еще не могу использовать версию sed для GNU. Например:
echo a | sed ’s_A_X_i’
возвращает: плохой флаг в команде подстановки 'i'
Что я должен сделать, чтобы заставить работать версию GNU? Вот пути в моей переменной $PATH.
/Users/WN/-myUnix
/opt/local/bin
/opt/local/sbin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
/Applications/calibre.app/Contents/MacOS
/opt/ImageMagick/bin
/usr/texbin
Извините, если мой вопрос кажется очевидным, но я изучаю сценарии оболочки самостоятельно и пока не совсем понимаю, как устанавливаются программы UNIX. Будем весьма благодарны за любую помощь в использовании GNU-совместимых команд (в данном случае sed, но скоро мне также понадобятся и другие) на моем Mac без ущерба или ненужных помех.
12 ответов
У вас уже есть установленный GNU-SED без --with-default-names
вариант.
- С
--with-default-names
вариант, который устанавливаетsed
в/usr/local/bin/
- Без этой опции он устанавливает
gsed
Так что в вашем случае, что вам нужно сделать, это:
$ brew uninstall gnu-sed
$ brew install gnu-sed --with-default-names
Обновить путь при необходимости...
$ echo $PATH | grep -q '/usr/local/bin'; [ $? -ne 0 ] && export PATH=/usr/local/bin:$PATH
$ echo a | sed 's_A_X_i'
или использовать gsed
как другие предложили.
Когда вы устанавливаете версию GNU sed
для Mac OS X с использованием:
$ brew install gnu-sed
Программа, которую вы используете gsed
,
Так, например:
$ echo "Calimero is a little chicken" > test
$ cat test
Calimero is a little chicken
$ gsed -i "s/little/big/g" test
$ cat test
Calimero is a big chicken
Кроме того, чтобы дополнить использование инструментов команд GNU в Mac OS X, здесь есть хороший пост в блоге, где можно получить инструменты из linux:
Установите и используйте инструменты командной строки GNU в Mac OS/OS X
$ brew install gnu-sed $ export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
С этими двумя командами GNU-SED работает правильно
sed
который поставляется с OS X находится в /usr/bin
,
sed
тот homebrew
устанавливает в /usr/local/bin
,
Если вы предпочитаете использовать homebrew
Во-первых, у вас есть два варианта:
Опция 1
Каждый раз, когда вы хотите использовать homebrew
sed
, тип
/usr/local/bin/sed
или предпочтительно
Вариант 2
Переехать /usr/local/bin/
впереди (т.е. раньше) /usr/bin
в вашем PATH в вашем профиле входа, как это
export PATH=/usr/local/bin:<other places>
Если вам нужно использовать команду gnu-sed с их обычными именами, вы можете добавить каталог "gnubin" в ваш PATH из вашего bashrc. Просто используйте следующую команду в вашем bash или терминале.
export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
--with-default-names
у меня не работало на Mac OS X 10.14.2, поэтому я создал символическую ссылку sed
в gsed
выше в $PATH
Я также создал символическую ссылку с именем sed.1
к gsed.1
Manpage выше в $MANPATH
так man
будет иметь доступ к gsed
man-страница вместо стандартной sed
страница руководства
этот экспорт PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
действительно только для терминала SESSIOn, как только вы перезапустите его GONE (Mojave)
Несколько более быстрый способ сделать то, что предлагает @pjz, заключается в следующем:
for p in $(ls -d ${HOMEBREW_PREFIX:-/usr/local}/Cellar/*/*/libexec/gnubin); do
export PATH="${p}:${PATH}"
done
Конечно, это предполагает, что каждый пакет GNU вbrew
всегда будет иметь один и тот же уровень каталогов, чтобы добраться доgnubin
.
Кроме того, вы можете ускоритьfind
добавив-maxdepth 4
флаг перед-type d
чтобы уменьшить, как далеко это должно делать в каталогах.
Один раз--with-default-names
больше не поддерживается, вы можете установить его обычным способом с помощьюbrew install gnu-sed
а затем получить его путь с помощьюbrew info gnu-sed
.
brew install gnu-sed
brew info gnu-sed
выход:
...
==> Caveats
GNU "sed" has been installed as "gsed".
If you need to use it as "sed", you can add a "gnubin" directory
to your PATH from your bashrc like:
PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
==> Analytics
...
Затем используйте его на своем пути:
export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
При работеbrew install gnu-sed
на последнем доморощенном он сообщает в конце:
==> Caveats
GNU "sed" has been installed as "gsed".
If you need to use it as "sed", you can add a "gnubin" directory
to your PATH from your bashrc like:
PATH="/opt/homebrew/opt/gnu-sed/libexec/gnubin:$PATH"
устанавливается по умолчанию какgsed
. Однако, если вы заглянете в/opt/homebrew/opt/gnu-sed/libexec/gnubi
вы найдете команду. Таким образом, выполнение приведенных выше инструкций для обновления пути должно означатьsed
работаетgnu-sed
.
Поскольку
--with-default-names
опция была удалена в январе 2019 года, мое решение для взлома:
# hack to override mac tools with homebrew versions (ls, sed, etc)
for p in `find "${HOMEBREW_PREFIX}" -type d -name gnubin` ; do
export PATH="${p}:${PATH}"
done
который немного медленный (просматривает каталог при каждом входе в систему), но работает, не заставляя меня изменять мой
.bashrc
для каждого инструмента gnu, который я устанавливаю с помощью brew.
Если вы установите brew install coreutils
вы получите sed и кучу других версий GNU, таких как tar, date и т. д. Все они установлены в /usr/local/bin и имеют префикс "g". Поэтому после установки, если вам нужна версия sed для GNU, вы должны набрать gsed
вместо. Работает отлично.