sed error "unescaped newline inside substitute pattern"

Nikos Vassiliadis nvass9573 at
Fri Mar 13 09:02:45 PDT 2009

David Banning wrote:
> Nikos Vassiliadis wrote:
>> David Banning wrote:
>>> Here is the php line that gives the error;
>>> cat start_text | sed "s/--maintext--/$test/" > endtext
>>> give error;
>>> sed: 1: "s/--maintext--/ Comment ...": unescaped newline inside 
>>> substitute pattern
>>> where $test contains customer input from a website form
>>> There is something about the content of the text within the variable 
>>> $test that is causing the error.
>>> Any pointers would be helpful.
>> You cannot use unescaped newlines in the replacement string:
>> # sed 's/foo/foo<<<Press enter here>>>
>> > bar/'
>> sed: 1: "s/foo/foo
>> bar/": unescaped newline inside substitute pattern
>> You have to precede each newline character with a backslash:
>> # sed 's/foo/foo\<<<Press enter here>>>
>> > bar/'
>> foo
>> foo
>> bar
>> The examples above are made using the bourne shell. The
>> above doesn't work in csh.
>> It's the documented behavior:
>>  2.   The escape sequence \n matches a newline character embedded in the
>>  pattern space.  You cannot, however, use a literal newline character
>>  in an address or in the substitute command.
>>  ...
>>  A line can be split by substituting a newline character into it.
>>  To specify a newline character in the replacement string, precede
>>  it with a backslash.
>> I am sure there is some good reason behind this...
>> OT, you should not pass parameters to shell scripts
>> using double quotes, since the shell will evaluate
>> possible variable values:
>> # echo "$OSTYPE"
>> FreeBSD
>> # echo '$OSTYPE'
>> I really doubt you want the first behavior, that is, variable
>> evaluation for strings coming from a web server.
>> HTH, Nikos
> The problem that I am having is that the input is from a web form - so I 
> have to deal with it - I have to somehow modify it so it can pass sed.

Don't you have control over this web form??? That's the place
you should filter your input... The sooner you do the filtering
the better.

Anyway, you could also use an intermediate variable that replaces
all newlines with spaces.

# a="This
 > is
 > the
 > input
 > from the
 > web server"
# b=`echo $a`
# sed "s/foo/$b/"
This is the input from the web server

I hope you won't go that route though... Nikos

More information about the freebsd-questions mailing list