From owner-freebsd-questions@FreeBSD.ORG Fri Mar 13 16:02:44 2009 Return-Path: Delivered-To: questions@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E0B561065670 for ; Fri, 13 Mar 2009 16:02:44 +0000 (UTC) (envelope-from nvass9573@gmx.com) Received: from mail.gmx.com (unknown [213.165.64.42]) by mx1.freebsd.org (Postfix) with SMTP id 42B648FC18 for ; Fri, 13 Mar 2009 16:02:44 +0000 (UTC) (envelope-from nvass9573@gmx.com) Received: (qmail invoked by alias); 13 Mar 2009 16:02:42 -0000 Received: from adsl73-179.ath.forthnet.gr (EHLO [192.168.1.5]) [77.49.4.179] by mail.gmx.com (mp-eu001) with SMTP; 13 Mar 2009 17:02:42 +0100 X-Authenticated: #46156728 X-Provags-ID: V01U2FsdGVkX1+oPhQdaTGoBpUsxSDKJDJbMAYKMbfrhuy6Ntpd1u HxXq+jvDr/50hZ Message-ID: <49BA838D.8010703@gmx.com> Date: Fri, 13 Mar 2009 18:02:21 +0200 From: Nikos Vassiliadis User-Agent: Thunderbird 2.0.0.19 (Windows/20081209) MIME-Version: 1.0 To: David Banning References: <20090312173436.GA51898@skytracker.ca> <49BA278D.5080800@gmx.com> <49BA6DBD.2010304@skytracker.ca> In-Reply-To: <49BA6DBD.2010304@skytracker.ca> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Y-GMX-Trusted: 0 X-FuHaFi: 0.6 Cc: questions@freebsd.org Subject: Re: sed error "unescaped newline inside substitute pattern" X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 Mar 2009 16:02:45 -0000 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<<>> >> > 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\<<>> >> > 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' >> $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/" foo This is the input from the web server ^D# I hope you won't go that route though... Nikos