使用ruby -pe命令行进行全局变量迭代

时间:2013-01-27 10:40:06

标签: ruby

我正在尝试使用ruby在gsub()中生成一个迭代值。我写的这行是:

ruby -pe '$i=0; gsub(/⎦\d+?⎡/, "⎦#{$i+=1}⎡")' < test.txt

但实际上并没有进行迭代;相反,它将$i的值设置为零,并在每次替换时将其加1。

我也用过:

ruby -pe 'BEGIN{$i=0}; gsub(/\d+?/, "#{$i+=1}")' < test.txt

那个输出行号而不是变量迭代值。当REGEX有匹配时,不应该只调用gsub()吗?

该命令的目的是将迭代值+ 1替换为文件中找到的下一个数字。例如:

  

Lorem ipsum dolor 2 坐下来,精神充沛地使用elit,sed 7 diam nonummy nibh euismod 1 tincidunt ut laoreet dolore magna 10 aliquam erat volutpat。 Ut wisi enim ad minim veniam,quis nostrud exerci 15 tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat。

输出:

  

Lorem ipsum dolor 1 坐下来,精神充沛地使用elit,sed 2 diam nonummy nibh euismod 3 tincidunt ut laoreet dolore magna 4 aliquam erat volutpat。 Ut wisi enim ad minim veniam,quis nostrud exerci 5 tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat。

UPDATE1: 我在进一步阅读后尝试了这一行:

ruby -pe 'BEGIN{$i=0}; gsub /\d+?/, "#{$i+=1}" if ~/\d+?/' < aa01.xhtml

但是,似乎我使用的命令行中的过程开始时是不正确的。它应该首先找到有数字的行。然后递增变量并将其替换为找到的数字的位置,并移动到下一个数字(如果在同一行中存在)。

1 个答案:

答案 0 :(得分:1)

我认为表达式"⎦#{$i+=1}⎡"只计算一次。每次替换时都会计算一个块。

$i=0
File.open('test.txt') do |f|
    f.each_line do |line|
        modif = line.gsub(/\d+/) {|num| "#{$i+=1}"}
        puts modif
    end
end

输出:

Lorem ipsum dolor 1 sit amet, consectetuer adipiscing elit, sed 2 diam nonummy nibh euismod 3 tincidunt ut laoreet dolore magna 4 aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci 5 tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.

新输入:

Lorem ipsum dolor 2 sit amet, consectetuer adipiscing elit, 
sed 7 diam nonummy nibh 
euismod 1 tincidunt ut 44

laoreet dolore magna 10 aliquam erat volutpat.
Ut wisi enim 0 ad minim veniam, 4 quis nostrud 
exerci 15 tation ullamcorper 66 suscipit 88 
lobortis 6 nisl ut aliquip ex 1 ea1 co1mmodo consequat.

输出:

Lorem ipsum dolor 1 sit amet, consectetuer adipiscing elit, 
sed 2 diam nonummy nibh 
euismod 3 tincidunt ut 4

laoreet dolore magna 5 aliquam erat volutpat.
Ut wisi enim 6 ad minim veniam, 7 quis nostrud 
exerci 8 tation ullamcorper 9 suscipit 10 
lobortis 11 nisl ut aliquip ex 12 ea13 co14mmodo consequat.