Sign up ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I find that \n doesn't work in sed under Mac OS X. Specifically, say I want to break the words separated by a single space into lines:

# input
foo bar

I use,

echo "foo bar" | sed 's/ /\n/'

But the result is stupid, the \n is not escaped!


After I consulted to google, I found a workaround:

echo 'foo bar' | sed -e 's/ /\'$'\n/g'

After reading the article, I still cannot understand what \'$'\n/g' means. Can some one explain it to me, or if there is any other way to do it? Thanks!

share|improve this question
this would probably work too: echo "foo bar" | tr ' ' '\n' – glenn jackman Jul 6 '11 at 18:17
Thanks for the advice. But currently I just use the above case as an example, I do need to know how to escape a \n. – Ivan Z. G. Xiao Jul 6 '11 at 22:50

4 Answers 4

These would also work:

echo 'foo bar' | sed 's/ /\

echo 'foo bar' | sed $'s/ /\\\n/g'

lf=$'\n'; echo 'foo bar' | sed "s/ /\\$lf/g"

OS X's sed doesn't interpret \n in the replace pattern, but you can use a literal linefeed preceded by a line continuation character. The shell replaces $'\n' with a literal linefeed before the sed command is run.

share|improve this answer

You can brew install gnu-sed and replace calls to sed with gsed.

If you don't want to prepend the "g" to sed, you can brew install gnu-sed --with-default-names and just call sed.

(Edit: updated brew flag, hat tip to Clément.)

share|improve this answer
Using the same software on all platform is way easier (at last to me) than dealing with every specificities of the Mac version. Beware, the option is now --with-default-names and not --default-names. However, this option did not worked on my installation, so I had to put a alias gsed=sed in my ~/.profile to make it work. – Clément May 11 at 11:40
This is an ugly workaround. It doesn't explain why sed on OS X behaves the way it does and makes the incorrect assumption that gnu-sed is more correct. Don't be a GNU-addict and stick to POSIX standards to avoid problems in the long run. – octosquidopus Oct 8 at 2:13

The expression $'...' is a bash-ism which produces ... with the standard escape sequences expanded. Th \' before it just means a backslash followed by the end of the quoted section, the resulting string is s/ /\. (Yes, you can switch quoting in the middle of a string; it doesn't end the string.)

POSIX standard sed only accepts \n as part of a search pattern. OS X uses the FreeBSD sed, which is strictly POSIX compliant; GNU, as usual, adds extra stuff and then Linux users all think that is some kind of "standard" (maybe I'd be more impressed if either of them had a standards process).

share|improve this answer
Now I understand the $'...' part. But... what is s/ /\ ? What do you mean by switch quoting? – Ivan Z. G. Xiao Jul 6 '11 at 22:53
'...' is one kind of shell quoting; $'...' is another. There's also "..." and \x to quote a single character. You can combine those in a single word, which is what was being done there, switching from a normal '' string to a $'' string to translate the \n. As for the rest, it's building up a sed command (s/text/replacement/flags). In this case the command is started, including a backslash at the end to protect the literal newline that the $'\n/g' appends. The result is to replace all (the /g flag) spaces with newlines. – geekosaur Jul 6 '11 at 23:01

The workaround you found passes a single argument string to sed -e.

That argument ends up being a string in the familiar sed s/ / /g format.

That string is created in two parts, one after the other.

The first part is quoted in '...' form.

The second part is quoted in $'...' form.

The 's/ /\' part gets the single-quotes stripped off, but otherwise passes through to sed just as it looks on the command-line. That is, the backslash isn't eaten by bash, it's passed to sed.

The $'\n/g' part gets the dollar sign and the single-quotes stripped off, and the \n gets converted to a newline character.

All together, the argument becomes

s/ /\newline/g

[That was fun. Took a while to unwrap that. +1 for an interesting question.]

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.