How to use GNU sed on Mac OS 10.10+, 'brew install --default-names' no longer supported
Asked Answered
C

11

115

Under Mac OS 10.10.3, I installed gnu-sed by typing:

brew install gnu-sed --default-names

When I type it again, I get the message:

gnu-sed-4.2.2 already installed

However, even after rebooting the system and restarting Terminal, I still cannot use the GNU version of sed. For example:

echo a | sed ’s_A_X_i’

returns: bad flag in substitution command 'i'

What should I do to get the GNU version working? Here are the paths in my $PATH variable.

/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 

I'm sorry if my question seems obvious, but I am learning shell scripting on my own and don't quite understand yet how UNIX programs are installed. Any help to use GNU compliant commands (in this case sed, but soon I'll need others as well) on my Mac without causing damage or unnecessary clutter would be greatly appreciated.

Complex answered 2/5, 2015 at 14:41 Comment(1)
Where did brew install GNU sed? Is that directory on your PATH? What do you get if you type sed --version? (BSD sed will complain; GNU sed will report its version information.) Until you either have the brew directory on your PATH ahead of /usr/bin or you learn to use the absolute pathname to GNU sed, you will not be running GNU sed. Be careful with quotes, too. is a word-processing quote, unlike '.Amiens
W
124

Note (2019):

The --with-default-names option is removed since January 2019, so now that option is not available anymore.

When installing, Homebrew instructs on how to adapt the path, if one wants to use sed without the g prefix.


You already have the gnu-sed installed without the --with-default-names option.

  • With --with-default-names option it installs sed to /usr/local/bin/
  • Without that option it installs gsed

So in your case what you gotta do is:

$ brew uninstall gnu-sed
$ brew install gnu-sed --with-default-names

Update path if needed...

$ echo $PATH | grep -q '/usr/local/bin'; [ $? -ne 0 ] && export PATH=/usr/local/bin:$PATH
$ echo a | sed 's_A_X_i'

or use gsed as others suggested.

Weinberg answered 15/1, 2016 at 16:49 Comment(2)
--with-default-names option is no longer supportedInhabitancy
Once --with-default-names is no longer supported, you can install it normally with brew install gnu-sed then get it's path with brew info gnu-sed.Callosity
G
67

When you install the GNU version of sed for Mac OS X using:

$ brew install gnu-sed

The program that you use is gsed.

So for example:

$ 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

Also, to compliment the use of GNU command tools on Mac OS X, there is a nice blog post here to get the tools from linux:

Install and use GNU command line tools on Mac OS/OS X

Guru answered 17/11, 2015 at 11:50 Comment(0)
R
27

$ brew install gnu-sed

$ export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"

With these two commands gnu-sed works properly

Repletion answered 6/5, 2019 at 14:33 Comment(1)
remember this only works for the current terminal sessionShotten
V
21

The sed that ships with OS X is in /usr/bin.

The sed that homebrew installs is in /usr/local/bin.

If you prefer to use the homebrew one, you have two options:

Option 1

Every time you want to use homebrew sed, type

/usr/local/bin/sed

or, preferably

Option 2

Move /usr/local/bin/ ahead (i.e. before) /usr/bin in your PATH in your login profile, like this

 export PATH=/usr/local/bin:<other places>
Victualer answered 2/5, 2015 at 17:17 Comment(0)
Z
9

If you need to use gnu-sed command with their normal names, you can add a "gnubin" directory to your PATH from your bashrc. Just use the following command in your bash or terminal.

export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
Zygophyllaceous answered 26/6, 2015 at 18:57 Comment(0)
D
2

--with-default-names didn't work for me on Mac OS X 10.14.2 so I created a symlink named sed to gsed higher in the $PATH

I also created a symlink named sed.1 to the gsed.1 manpage higher in the $MANPATH so man would access the gsed manpage instead of the default sed manpage

Defend answered 10/1, 2019 at 17:6 Comment(1)
You can also do alias, e.g. alias sed=gsed.Nebula
M
1

this export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"

is only valid per terminal SESSIOn as soon as you restart its GONE ( Mojave )

Microbe answered 14/4, 2021 at 11:6 Comment(2)
If you add it to .bashrc (if you use bash as your shell) or .zshrc if you're using zsh as your shell, it will be executed every time you log in. Apple used to default to bash as the shell, but in Catalina switched the default shell to zsh. You can tell which your account is set to use by running w in the terminal window - you'll get a bunch of lines, some of which (in my case, I use zsh) look like jpb s000 - Sun20 1day -zsh - the -zsh shows my account is using zsh.Tenedos
Welcome to StackOverflow. Please note that this is not a forum and answers like this will typically be downvoted. (If you ever get a downvoted answer, you can just remove it; that's all that's required to restore your points.) Instead we are typically looking for answers that include a direct solution to the OP's problem, and what you did to get there. For more information, see How to Answer.Obnubilate
F
0

Since the --with-default-names option was removed in Jan. 2019, my hack solution is:

# 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

which is a little slow (crawling the dir every login) but works without forcing me to modify my .bashrc for every gnu tool I happen to install with brew.

Fatally answered 3/12, 2021 at 18:43 Comment(0)
K
0

A slightly faster way to do what @pjz suggests is the following:

for p in $(ls -d ${HOMEBREW_PREFIX:-/usr/local}/Cellar/*/*/libexec/gnubin); do
    export PATH="${p}:${PATH}"
done

Of course this assumes every GNU package in brew will always have the same level of directories to get to gnubin.

Alternatively, you can speed up find by adding the -maxdepth 4 flag before -type d to reduce how far it has to do into directories.

Kittykitwe answered 8/9, 2022 at 5:54 Comment(0)
G
0

When running brew install gnu-sed on latest homebrew it reports at the end:

==> 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"

gnu-sed installs by default as gsed. However, if you look in /opt/homebrew/opt/gnu-sed/libexec/gnubi you'll find a sed command. So following the above instructions to update the path should mean sed runs gnu-sed.

Godding answered 20/10, 2022 at 10:45 Comment(0)
C
0

Once --with-default-names is no longer supported, you can install it normally with brew install gnu-sed and then get its path with brew info gnu-sed.

brew install gnu-sed
brew info gnu-sed

output:

...
==> 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

...

Then use it in your path:

export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
Callosity answered 12/7, 2023 at 12:40 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.