Ruby 如何通过ARGV打印正在使用的文件的行号?

Ruby 如何通过ARGV打印正在使用的文件的行号?,ruby,file,printing,line,argv,Ruby,File,Printing,Line,Argv,我当前正在通过ARGV打开运行时获取的文件: File.open(ARGV[0]) do |f| f.each_line do |line| 找到匹配项后,我将输出打印给用户 if line.match(/(strcpy)/i) puts "[!] strcpy does not check for buffer overflows when copying to destination." puts "[!] Consider using strncpy or strlcpy

我当前正在通过ARGV打开运行时获取的文件:

File.open(ARGV[0]) do |f|
  f.each_line do |line|
找到匹配项后,我将输出打印给用户

if line.match(/(strcpy)/i)
   puts "[!] strcpy does not check for buffer overflows when copying to destination."
   puts "[!] Consider using strncpy or strlcpy (warning, strncpy is easily misused)."
   puts " #{line}"
end
我想知道如何打印(ARGV[0])文件中匹配行的行号


使用
print\uuuuu LINE\uuuu
显示Ruby脚本中的行号。我尝试了许多不同的
print\uuuuuuuuuuuu
变体,使用了
{LINE}
的不同字符串插值,但都没有成功。有没有办法从文件中打印出行号?

当Ruby的IO类打开文件时,它会将
$。
全局变量设置为0。对于读取的每一行,该变量都递增。因此,要知道读了哪一行,只需使用
$。

在模块中查找
$。
$INPUT\u LINE\u NUMBER

我们还可以使用IO类中的
lineno
方法。我发现这有点复杂,因为我们需要一个IO流对象来固定它,而
$。
将始终有效

我将更简单地编写循环:

File.foreach(ARGV[0]) do |line|
需要考虑的是,如果您使用的是*nix系统,您可以使用操作系统内置的
grep
fgrep
工具大大加快处理速度。“grep”系列应用程序经过了高度优化,可以满足您的需要,并且可以找到所有出现的情况,只有第一个,可以使用正则表达式或固定字符串,并且可以使用Ruby的
%x
或backtick操作符轻松调用

puts `grep -inm1 abacus /usr/share/dict/words`
哪些产出:

34:abacus

-inm1
表示“忽略字符大小写”、“输出行号”、“第一次出现后停止”

,非常有效!谢谢你对锡人的帮助。我不知道英语模块;)是的,我以前用过grep,但不是为了这个目的,我会查一查。也谢谢你修剪了这个环。看起来好多了!