【问题标题】:Using global variable iteration with ruby -pe command line通过 ruby​​ -pe 命令行使用全局变量迭代
【发布时间】:2013-01-10 21:02:47
【问题描述】:

我正在尝试使用 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 sat amet, consectetuer adipiscing 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 sat 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.

更新1: 进一步阅读后我尝试了这一行:

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

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

【问题讨论】:

  • 你需要这种风格的命令行而不是ruby my_easy_script.rb 吗?
  • 风格没有限制。我只是认为单线会更容易,但也许不是。

标签: ruby


【解决方案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.

【讨论】:

  • 看来你明白了,但我试过了,也没有用。同样在执行结束时,我得到:** from ./itr_refs.rb:7:in `open' **.
  • @ismail 它在 Ruby 1.9.2 中和 1.8.6 中一样好用,还支持多线输入。
  • 谢谢,确实有效。不知道为什么我第一次尝试它时它不起作用。
猜你喜欢
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多