我目前正在通过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}
的不同字符串插值但没有成功。有没有办法打印出文件中的行号?
答案 0 :(得分:10)
当Ruby的IO类打开文件时,它会将$.
全局变量设置为0.对于读取的每一行,变量都会递增。因此,要知道已读取的行,只需使用$.
。
在$.
模块中查看$INPUT_LINE_NUMBER
或lineno
。
我们也可以使用属于IO类的$.
方法。我发现有点复杂,因为我们需要一个IO流对象来解决这个问题,而File.foreach(ARGV[0]) do |line|
将始终有效。
我会更简单地编写循环:
grep
要考虑的是,如果您使用的是* nix系统,则可以使用操作系统的内置fgrep
或%x
工具来大大加快处理速度。 “grep”系列应用程序针对您的需求进行了高度优化,并且可以查找所有实例,只有第一个,可以使用正则表达式或固定字符串,并且可以使用Ruby的puts `grep -inm1 abacus /usr/share/dict/words`
或反引号操作符轻松调用。
34:abacus
哪个输出:
-inm1
{{1}}表示“忽略字符大小写”,“输出行号”,“第一次出现后停止”