Insert newline (\\n) using sed

旧巷老猫 提交于 2019-12-01 02:56:38

The sed on BSD does not support the \n representation of a new line (turning it into a literal n):

$ echo "123." | sed -E 's/([[:digit:]]*)\./\1\n next line/'
123n next line

GNU sed does support the \n representation:

$ echo "123." | gsed -E 's/([[:digit:]]*)\./\1\nnext line/'
123
next line

Alternatives are:

Use a single character delimiter that you then use tr translate into a new line:

$ echo "123." | sed -E 's/([[:digit:]]*)\./\1|next line/' | tr '|' '\n'
123
next line

Or use an escaped literal new line in your sed script:

$ echo "123." | sed -E 's/([[:digit:]]*)\./\1\
next line/'
123
next line

Or use awk:

$ echo "123." | awk '/^[[:digit:]]+\./{sub(/\./,"\nnext line")} 1'
123
next line

Or use GNU sed which supports \n

The portable way to get a newline in sed is a backslash followed by a literal newline:

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

I guarantee there's a far simpler solution to your whole problem by using awk rather than sed though.

The following works on Oracle Linux, x8664:

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

If you need it to match more than once per line, you'll need to place a g at the end, as in:

$ echo 'foobarfoobaz' | sed 's/foo/foo\n/g'
foo
barfoo
baz
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!