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