[TxMt] regex question

Allan Odgaard throw-away-1 at macromates.com
Wed Feb 22 09:35:50 UTC 2006


On 22/2/2006, at 9:21, Charilaos Skiadas wrote:

>> But when I run the command none of the tabs or newlines I've  
>> specified in the replace section of the command are applied to the  
>> text in question [...]
> [...]
> 1) It searches each line separately, in which case it won't match  
> the multiline search you are performing

That’s exactly it! :)

The -p switch puts a loop around the perl code, which execute that  
code for each line in the input (stdin).

So: perl -pe 'foo' translates to:

    for each line in the input
       print result of running “foo” on line

Loops and such are generally easier in Ruby, so instead try:

ruby -e '
	print STDIN.read.gsub(
	   /^([A-Z]+.*[A-Z]*\s*)\n(\(.+\))\n(.+)$/,
	   "\n\n\t\t\t\t\1\n\t\t\t\2\n\n\3"
	)
'

So what’s s/«regexp»/«replacement»/ in Perl is sub(/«pattern»/,  
«replacement») in Ruby. And instead of adding ‘g’ as option to make  
it “global”, we use gsub.

In addition, in Ruby we have to use \1 instead of $1 etc.

In Perl the s/«regexp»/«replacement»/ runs on the $_ variable (which  
is the current line, when used with the -p switch). Ruby has a  
similar feature (both -p and $_ as “accumulator” reguster), but in  
the above we explicitly call gsub on all we read from STDIN, instead  
of doing it line-by-line.




More information about the textmate mailing list