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 [...]
[...]
- 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.