From: Andrew Johnson Date: 2006-03-14T02:18:45+09:00 Subject: Re: simple one-liners: last line missing On Tue, 14 Mar 2006 01:46:50 +0900, Tobi Reif wrote: [snip] > I don't really need to achieve that modification. Instead I'd like to > understand why the following version one doesn't work: > > $ ruby -pe 'sub(/(\S+)\s+(\S+)/,"#{$2} #{$1}")' data.txt > > foo first > foo second > $ When doing substitutions with a string replacement, you do not get what you might expect because the interpolation of #{$1} in the replacement string happens when the arguments are evaluated and passed into the sub() or gsub() methods, not during the match. That means they will have whatever value they had from the last successful match (or nil, as in your case with the first line printed). To access backreferences within a replacement string, you may use the same notation as you do for backreferences within the pattern itself: \1, \2, etc. For your example: ruby -pe 'sub(/(\S+)\s+(\S+)/,%q(\2 \1))' data.txt Alternatively, you may use the block form of replacement, in which case the block is evaluated at match-time and $1, $2, etc are available and refer to their respective backreferences within the current match: ruby -pe 'sub(/(\S+)\s+(\S+)/){"#{$2} #{$1}"}' data.txt cheer's andrew -- Andrew L. Johnson http://www.siaris.net/ Reality is that which, when you stop believing in it, doesn't go away. -- Philip K. Dick