From: Nathaniel Madura on
I am getting a string that has escape sequences in it, and I would like
to print it to the screen after reprocessing the escape sequences. Maybe
I have missed something obvious but I haven't seen anything in the docs
that suggest how to do this. To replicate the behaviour I create a
string in irb like so:

$ irb
>> str = 'some \n\r string \t with \r escape \n sequences'
=> "some \\n\\r string \\t with \\r escape \\n sequences"
>> eval "puts str"
some \n\r string \t with \r escape \n sequences
=> nil
>> puts "%s" % str
some \n\r string \t with \r escape \n sequences
=> nil

I recognize that I can simply do a gsub:

>> puts str.gsub(/\\n/, "\n")
some
\r string \t with \r escape
sequences
=> nil

but that would mean I would have to pattern match all sequences, and it
seems like there should be a better way

Any suggestions?
--
Posted via http://www.ruby-forum.com/.

From: Robert Klemme on
2010/4/22 Nathaniel Madura <nmadura(a)umich.edu>:
> I am getting a string that has escape sequences in it, and I would like
> to print it to the screen after reprocessing the escape sequences. Maybe
> I have missed something obvious but I haven't seen anything in the docs
> that suggest how to do this. To replicate the behaviour I create a
> string in irb like so:
>
> $ irb
>>> str = 'some \n\r string \t with \r escape \n sequences'
> => "some \\n\\r string \\t with \\r escape \\n sequences"
>>> eval "puts str"
> some \n\r string \t with \r escape \n sequences
> => nil

If you use eval you rather need to do something like this

irb(main):004:0> str = 'some \n\r string \t with \r escape \n sequences'
=> "some \\n\\r string \\t with \\r escape \\n sequences"
irb(main):005:0> puts eval('"'+str+'"')
some
escape with
sequences
=> nil
irb(main):006:0>


>>> puts "%s" % str
> some \n\r string \t with \r escape \n sequences
> => nil
>
> I recognize that I can simply do a gsub:
>
>>> puts str.gsub(/\\n/, "\n")
> some
> \r string \t with \r escape
>  sequences
> => nil
>
> but that would mean I would have to pattern match all sequences, and it
> seems like there should be a better way

Actually doing a replacement would probably be my preferred way
because of the security implications of eval.

You can do it in one go

irb(main):008:0> PAT = {'n'=>"\n",'t'=>"\t",'r'=>"\r"}
=> {"n"=>"\n", "t"=>"\t", "r"=>"\r"}
irb(main):009:0> str.gsub(/\\(.)/){|m| PAT[$1]}
=> "some \n\r string \t with \r escape \n sequences"

Kind regards

robert

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/