ruby - 如何通过 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 (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 系统,您可以使用操作系统内置的 grepfgrep 工具来大大加快您的速度加工。 “grep”系列应用程序针对做你想做的事情进行了高度优化,可以找到所有出现的地方,只有第一个,可以使用正则表达式或固定字符串,并且可以使用 Ruby 的 %x 轻松调用或反引号运算符。

puts `grep -inm1 abacus /usr/share/dict/words`

哪些输出:

34:abacus

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

关于ruby - 如何通过 ARGV 打印我正在使用的文件的行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19173408/

相关文章:

python - 如何按日期范围更新打印行

javascript - 自定义文件输入

java - 创建新的 File 实例是否会导致创建空文件?

ruby-on-rails - rails : adding additional methods to a model for cache retrieval

java - Android 中写入锁定文件

asp.net-mvc - 圆形图像和背景颜色打印失败

java - 如何使用打印机API在JAVA中格式化文本以进行打印?

python - 如何将打印输出重定向到 TXT 文件

mysql - 使用 Ruby 但不使用 Rails 连接到 mysql

mysql - rails :Add foreign key to primary key of multiple columns