我目前正在打开一个在运行时通过 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 __LINE__
显示 Ruby 脚本中的行号。我已经尝试了 print __LINE__
的许多不同变体以及 #{line}
的不同字符串插值,但没有成功。有什么方法可以打印出文件中的行号吗?
最佳答案
当 Ruby 的 IO 类打开一个文件时,它将 $.
全局变量设置为 0。对于读取的每一行,该变量都会递增。因此,要知道读取了哪一行,只需使用 $.
.
查看 English $.
或 $INPUT_LINE_NUMBER
的模块。
我们还可以使用属于 IO 类的 lineno
方法。我发现这有点复杂,因为我们需要一个 IO 流对象来附加它,而 $.
将始终有效。
我会更简单地编写循环:
File.foreach(ARGV[0]) do |line|
需要考虑的是,如果您使用的是 *nix 系统,您可以使用操作系统内置的 grep
或 fgrep
工具来大大加快您的速度加工。 “grep”系列应用程序针对做你想做的事情进行了高度优化,可以找到所有出现的地方,只有第一个,可以使用正则表达式或固定字符串,并且可以使用 Ruby 的 %x
轻松调用或反引号运算符。
puts `grep -inm1 abacus /usr/share/dict/words`
哪些输出:
34:abacus
-inm1
表示“忽略字符大小写”、“输出行号”、“第一次出现后停止”
关于ruby - 如何通过 ARGV 打印我正在使用的文件的行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19173408/