Ruby/Programming/行番号印字

Last-modified: 2008-07-17 (木) 18:32:08

(08.07.17)
テキストファイルの行頭に行番号を付加して印字したいことがよくあるので、そういうスクリプトを作るんだけど、こういうスクリプトは古くはawkでやっつけたものだが、今どきはRubyなんだけど、時時行番号のフォーマットを変えたいことが起こるので、実際起こったので、以前殆どやっつけで書いた行番号付加のスクリプトに手を加えることにした。

単純なスクリプトだけど重宝するし、重宝しそうな予感。

使い方はこんな感じ。

$ linenumber.rb [-f <書式文字列>] [-s <開始行番号>] [filename...]

プログラムはこんな感じ。

#! /usr/bin/env ruby
#
# linenumber.rb
formstr = ""
startnum = ""
while ARGV.size > 0 and ARGV[0] =~ /^-/ do
  case ARGV[0]
  when "-f" then
    if ARGV.size > 1 then
      formstr = ARGV[1].sub(/~/, "%")
      ARGV.shift
    end
  when "-s" then
    if ARGV.size > 1 then
      startnum = ARGV[1]
      ARGV.shift
    end
  else
    printf "unknown option -- %s\n", ARGV[0]
    exit 1
  end
  ARGV.shift
end
if formstr == "" then
  formstr = "%6d: "
end
if startnum == "" then
  startnum = "1"
end
n = startnum.to_i - 1
while(gets) do
  n += 1
  printf("%s%s", sprintf(formstr, n), $_)
end

説明

  • linenumber.rb -f "(~6d)" filename... みたいな感じで使う。
  • オプション-fで行番号の書式文字列を与えているわけだが、これはsprintfの書式文字列そのもの。
  • ただし、Windowsのバッチでは"%"がバッチ変数と解釈されてしまうので、代わりに"~"を使うことにして逃げた。
  • オプション-sは開始番号を与える。遊び半分でつけた。
  • このスクリプトと、EmacsやXyzzyやviやed(笑)みたいにバッファの内容を外部コマンドに引き渡せるエディタと組合わせて使うとすごく気持がいい。
  • EmacsやXyzzyなら自力で実現できるわけだけど、外部コマンドとしても使えるのがよいよね。

ここを参照しているページ

#related: relatedプラグインは廃止されました。