From: Mike Stok Date: 2012-05-20T22:42:17+09:00 Subject: [ruby-core:45153] Re: [ruby-trunk - Bug #6474][Open] Substitution bug in String # gsub Maybe you are bing confused by the way irb displays results as double quoted strings. If you explicitly use puts: ratdog:~ mike$ irb 1.9.3-p125 :001 > s = 'a&b' => "a&b" 1.9.3-p125 :002 > puts s.gsub '&', '\&' a&b => nil 1.9.3-p125 :003 > puts s.gsub '&', '\\&' a&b => nil 1.9.3-p125 :004 > puts s.gsub '&', '\\\&' a\&b => nil 1.9.3-p125 :005 > puts s.gsub '&', '\\\\&' a\&b => nil I like using a block to make this situation less full of backslashes e.g. 1.9.3-p125 :006 > puts s.gsub('&') { '\&' } a\&b To see the way irb displays strings consider: 1.9.3-p125 :008 > s = 'a\&b' => "a\\&b" 1.9.3-p125 :009 > puts s a\&b => nil 1.9.3-p125 :010 > puts s.length 4 => nil 1.9.3-p125 :011 > s = "a\tb" => "a\tb" 1.9.3-p125 :012 > puts s a b => nil Hope this helps, Mike On 2012-05-20, at 9:19 AM, hadmut (Hadmut Danisch) wrote: > > Issue #6474 has been reported by hadmut (Hadmut Danisch). > > ---------------------------------------- > Bug #6474: Substitution bug in String # gsub > https://bugs.ruby-lang.org/issues/6474 > > Author: hadmut (Hadmut Danisch) > Status: Open > Priority: Normal > Assignee: > Category: > Target version: > ruby -v: ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux] > > > Hi, > > I need to replace all occurences of & with \& in a String (generating LaTeX input). > > However, gsub has a problem with unescaping the \ character in the replacement string: > > irb(main):001:0> "a&b" > => "a&b" > irb(main):002:0> "a&b".gsub('&','\&') > => "a&b" > irb(main):003:0> "a&b".gsub('&','\\&') > => "a&b" > irb(main):004:0> "a&b".gsub('&','\\\&') > => "a\\&b" > irb(main):005:0> "a&b".gsub('&','\\\\&') > => "a\\&b" > > So it always inserts either zero or two \ characters, but never a single one. Not possible to generate "a\&b" > > > regards > > > > > -- > http://bugs.ruby-lang.org/ -- Mike Stok http://www.stok.ca/~mike/ The "`Stok' disclaimers" apply.