Как использовать 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

Каждый раз, когда вы хотите использовать homebrewsed, тип

/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 вместо. Работает отлично.

Другие вопросы по тегам