【问题标题】:How do I print the line number of the file I am working with via ARGV?如何通过 ARGV 打印我正在使用的文件的行号?
【发布时间】:2013-10-04 04:47:31
【问题描述】:

我目前正在打开通过 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 file printing line argv


    【解决方案1】:

    当 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 表示“忽略字符大小写”、“输出行号”、“第一次出现后停止”

    【讨论】:

    • 效果很好!感谢锡人的帮助。我不知道英语模块;)
    • 是的,我过去使用过 grep,但不是出于此目的,我会检查一下。还要感谢您减少循环。看起来好多了!
    猜你喜欢
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多