2013-10-04 17 views
6

は、私は現在、ARGVを経由して、実行時に撮影したファイルを開いています。ARGV経由で作業しているファイルの行番号を印刷するにはどうすればよいですか?試合は、私は、ユーザーに出力を印刷見つかったら</p> <pre><code>File.open(ARGV[0]) do |f| f.each_line do |line| </code></pre> <p>:

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スクリプトの行番号が表示されます。私はのさまざまなバリエーションを試しましたが、異なる文字列の補間は#{line}で成功しませんでした。ファイルから行番号を印刷する方法はありますか?

答えて

9

RubyのIOクラスがファイルを開くと、グローバル変数$.が0に設定されます。読み込まれた各行に対して、変数がインクリメントされます。ですから、どの行が読み込まれたのかを知るには、単に$.を使用してください。

$.または$INPUT_LINE_NUMBEREnglishモジュールを参照してください。

また、IOクラスの一部であるlinenoメソッドを使用することもできます。 $.は常に動作するのに対し、IOストリームオブジェクトが必要なので、少し複雑になっています。

私はもっと単純にループを記述します:あなたは* nixのシステムにしている場合についてです考える

File.foreach(ARGV[0]) do |line| 

何かを、あなたが大幅にOSのビルトインgrepまたはfgrepツールを使用することができます処理速度を上げます。 "grep"アプリケーションファミリーは、あなたが望むように高度に最適化されており、最初のものだけが正規表現や固定文字列を使用でき、Rubyの%xやバックティック演算子を使って簡単に呼び出すことができます。

34:abacus 

-inm1は、 "文字ケースを無視する" "出力行番号"、素晴らしい仕事

+0

"最初に出現した後に停止" を意味:出力

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

!ヘルプティンマンに感謝します。私は英語のモジュールを知らなかった;) – nanotechz9l

+0

ええ、私は過去にgrepを使用しましたが、その目的のためではありません、私はそれをチェックアウトします。また、ループをトリミングしてくれてありがとう。もっとよく見えます! – nanotechz9l

関連する問題