LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Software (https://www.linuxquestions.org/questions/linux-software-2/)
-   -   Sed: insert a newline. Why does not it work? (https://www.linuxquestions.org/questions/linux-software-2/sed-insert-a-newline-why-does-not-it-work-158806/)

J_Szucs 03-17-2004 01:46 AM

Sed: insert a newline. Why does not it work?
 
I want to replace "," by newline in each line, and I tried this:
echo "first,second,third" | sed 's/,/\n/g'

It poduced this:
firstnsecondnthird
(no newlines there :-()

So I tried this:
echo "first,second,third" | sed 's/,/'"$(printf '\n')"'/g'

Which produced this:
firstsecondthird
(still no newlines there :-(((((()

There are millions of sed examples like this on the internet, so why dos not it work for me?
Is there a workaround?

druuna 03-17-2004 02:52 AM

It does work if you do it like this:

echo "one,two,three" | sed 's/,/\
/g'


After the backslash you just hit return, you will get the PS2 prompt (probably >) and continue with the /g' part.

From within a script I do like this sollution, when using this from the command line I do like this one better:

echo "first,second,third" | awk 'BEGIN { FS=","; OFS="\n" } { print $1, $2, $3 }'

Hope this helps.

J_Szucs 03-17-2004 04:48 AM

Well, your example with sed really works from the command line, but, actually I want to use it from a script.
(Only it was easier to test possible commands from the command line)

The awk command would be OK, but that presumes that there are always 3 fields ($1, $2,$3), while in my case there can be any number of fields on the line.

In the meantime I found that tr is the best to it:
echo "first,second,third" | tr ',' '\n'

Result:
first
second
third

It is just what I want.

bysin 04-11-2004 08:39 PM

Try this instead:


echo "one,two,three" | sed "s/,/\\`echo -e '\n\r'`/g"

xeleema 03-19-2014 01:28 PM

Resurrecting Thread w/ the "Why"
 
Greetingz!

I'm 'resurrecting' this thread (read: posting to a very old thread) because I keep coming across this in google searches.

I'm going to treat this as a two-part Question;

1st Question: How can I replace a character with a newline using sed?
2nd Question: Why doesn't sed use \n to denote a newline in a substitution expression?


Answer for "How":

On a Linux system, the examples OP is seeing everywhere work.
However, sed on an actual UNIX (or BSD) system like Solaris & HP-UX can behave differently.

The GNU version of 'sed' (4.1.5 circa 2003, for me) handles '\n' as you would expect.

Using Red Hat Enterprise Linux 5 (Update 9)
xeleema @ Linux $ echo "one,two,three"|sed -e 's/,/\n/g'
one
two
three
xeleema @ Linux $
However something like Solaris (Release 10/08 Update 6), this gives what the OP is getting;
xeleema @ SunOS $ echo "one,two,three"|sed -e 's/,/\n/g'
onentwonthree
xeleema @ SunOS $
For Solaris, you have two options;

1) Embed a newline the old-fashioned way (this is good at the command-line, but not so much when doing this in a script);
Note that you have to basically press enter right after the backslash (some shells don't require a backslash).
Also, the ">" character is the default 'PS2' prompt (see the man page for ksh or bash).
xeleema @ SunOS $ echo "one,two,three" | sed -e 's/,/\
> /g'
one
two
three
xeleema @ SunOS $

2) Use the 'tr' command if you are replacing just a single character;
xeleema @ SunOS $ echo "one,two,three" | tr ',' '\n'
one
two
three
xeleema @ SunOS $
Answer for "Why":
Early versions of 'sed' (and implementations that copied them) did not originally accept escaped characters in the Right-Hand-Side (RHS).
Information on this can be found in SourceForge's 'sed FAQ' online.

I've been unable to track down more information as to 'why' sed doesn't like dealing with '\n', I suspect Mr. McMahon might have been able to give us more guidance, had he not passed away in 1989.

The fact that sed has been around since about 1973 could have something to do with it.
I've seen older code with limitations built-in that reflected the current pre-existing limitations of various parts of an Operating system.
Once the Operating System improves, someone else has to go back and patch (or outright fork) the code and write-in improvements.
I'd imagine that's what the maintainers of GNU sed eventually wound up doing.

dejayc 06-14-2019 08:18 AM

The literally-correct solution
 
Resurrecting this long-dead thread because it still ranks highly on Google search for this topic.

Having programmed Bash for a few decades, this type of question recurs often amongst Bash users, because the correct solution is not obvious to casual users.

While it's true that the creative use of GNU command-line tools can be used to insert a literal newline into the middle of a command like sed, the truth is that one can simply use Bash literal strings instead.

Here's how to represent newline from the Bash command line:

$'\n'

Yep, it's that simple:

Code:

$ echo $'Hello,\nWorld'
Hello,
World

or:

Code:

$ echo "Hello,"$'\n'"World"
Hello,
World

Bash string literals are not interpreted within interpolated strings, so the following will not work similarly:
Code:

$ echo "Hello,$'\n'World"
Hello,$'\n'World



All times are GMT -5. The time now is 05:40 PM.