problem with sed command and csh

Garrett Cooper youshi10 at u.washington.edu
Fri Jun 15 13:58:14 UTC 2007


Nikos Vassiliadis wrote:
> On Friday 15 June 2007 15:24, Olivier Regnier wrote:
>   
>> Nikos Vassiliadis a écrit :
>>     
>>> On Friday 15 June 2007 13:29, Olivier Regnier wrote:
>>>       
>>>> Hi everybody,
>>>>
>>>> Actually, i'm working on FreeBSD 6.2 and csh shell. With a sh script,
>>>> i trying to execute this command :
>>>> sed -e "s/MAKE_ARGS\([^{]*\){/MAKE_ARGS\1{\n\t'mail/nbsmtp' =>
>>>> 'WITH_IPV6=1 WITH_SSL=1',/" > /usr/local/etc/pkgtools.conf
>>>>
>>>> The result is not correct, i have an error :
>>>> sed: 1: "s/MAKE_ARGS\([^{]*\){/M . . .": bad flag in subsitute
>>>> command: 'n'
>>>>
>>>> Can you help me please ?
>>>>         
>>> s/MAKE_ARGS\([^{]*\){/MAKE_ARGS\1{\n\t'mail/nbsmtp' =>
>>> This n is invalid--------------------------^^^
>>>
>>> You should add a backslash before each slash
>>> that is not used as a separator for the s command.
>>> E.g.
>>> s/I want to substitute the \/ character/with the _ character/
>>> s/\/\/\//three slashes/
>>>
>>> You can also use a separator of choice for the s command.
>>> That is:
>>> s/foo/bar/ is equivalent to s at foo@bar@
>>> is equivalent to sAfooAbarA
>>> is equivalent to s1foo1bar1.
>>>
>>> keep in mind, that our sed might not be
>>> totally compatible with GNU sed.
>>>
>>> HTH, Nikos
>>>       
>> Thank for you anserw but the result is bad again :)
>> I tryed this : sed "s/MAKE_ARGS\([^{]*\){/MAKE_ARGS\1{\n\t'mail\/nbsmtp'
>> => 'WITH_IPV6=1 WITH_SSL=1',/" > /usr/local/etc/pkgtools.conf
>> but i have this with cat /usr/local/etc/pkgtools.conf
>>
>> MAKE_ARGS = {nt'mail/nbsmtp' => 'WITH_IPV6=1 WITH_SSL=1',
>> }
>>
>> Sed and csh is strange no ? I think \n \t not supported by csh.
>>     
>
> No, its sed. You cannot use backslash notation with
> BSD sed.
> nik:0:~$ sed "s/foo/\t\n/"
> foo
> tn
>
> You can use a literal tab character, but not a literal
> newline character...
>
> How about this?
> nik:0:~$ echo foo | awk '{ sub(/foo/, "foo\n\tbar"); print; }'
> foo
>         bar
>
> HTH, Nikos
>   
    Note: Using (t)csh as a part of any text manipulation operation I've 
discovered is generally a bad idea. When using sed, perl, or (g)awk, I 
always use (ba)sh, because (t)csh does some nasty evaluation of inline 
expressions, whereas (ba)sh doesn't. Just try using an expression with 
an exclamation point, for example :).
    Also for most strings, I'd get in the habit of quoting with single 
quotes instead of double quotes, if at all possible, because sometimes 
shells and other programs evaluate double quoted arguments differently 
than single quoted arguments.
-Garrett


More information about the freebsd-questions mailing list