Next| Prev|Index|凡例


B.2 バッファをコマンドで加工1

vi はコマンドの実行結果をバッファ内に取り込む事ができます。 ここでは例題として、ソースファイルの一覧表を作ってみます。
【例題】
wc コマンドの出力結果を表形式に加工する。

1) シェル・コマンドの実行結果を取り込む
viを起動し、:r! を用いてwc コマンドの出力をバッファ内に取り込みます。
	~
	~
	~
	:r!wc /user0/ycos_work/Fdump/*.c
			
	38      89     576 /user0/ycos_work/Fdump/fdump.c
	16      29     283 /user0/ycos_work/Fdump/fline.c
	14      27     236 /user0/ycos_work/Fdump/fread.c
	68     145    1095 total
	[ 5 more lines ]

2) 不要なディレクトリの部分を削除
各ファイル名の前についているパス名をs コマンドでヌルに置換します。
またスラッシュ(/)がパス名の構成要素であるため、区切り文字にカンマ(,)を指定しています。

	38      89     576 /user0/ycos_work/Fdump/fdump.c
	16      29     283 /user0/ycos_work/Fdump/fline.c
	14      27     236 /user0/ycos_work/Fdump/fread.c
	68     145    1095 total
	:%s,/user0/ycos_work/Fdump/,,
			
	38      89     576 fdump.c
	16      29     283 fline.c
	14      27     236 fread.c
	68     145    1095 total
	[ 5 substitutions ]

3) ファイル名を先頭に移動
s コマンドで各行のファイル名欄を先頭に移動する。
正規表現を利用した置換を行ないます。
時置換文字列にはマッチした文字列を \n の形で参照できます。
この例では、数字の羅列とそれ以外を \1 \2 として参照し入れ替えています。

	38      89     576 fdump.c
	16      29     283 fline.c
	14      27     236 fread.c
	68     145    1095 total
	:%s/\([0-9 ]*\)\([a-z].*\)/\2 \1/)
			
	fdump.c       38      89     576
	fline.c       16      29     283
	fread.c       14      27     236
	total        259     600    3750

4) 枠の追加
! コマンドによりバッファの内容を awk で変更します。
awk の printf 機能を用い、各項目間に縦棒(|)を差し込みます。
なお全て vi コマンドを用いています(コロン(:)で始まらない
	1G!Gawk '{printf("|\%-15s|\%5d|\%5d|\%5d|\n",$1,$2,$3,$4)}'
			
	|fdump.c        |   38|   89|  576|
	|fline.c        |   16|   29|  283|
	|fread.c        |   14|   27|  236|
	|total          |  259|  600| 3750|
(解説)
  • 1G - 1行目にカーソルを移動
  • !G - 現在行から最後の行までをコマンドに渡し、その結果で置換
  • awk '{書式変換}' - vi での % の意味を打ち消すためバックスラッシュ(\)を付加しています
    (v)のような複雑な置換を行わなくても直接 awk で同様の処理を行うことは可能ですが、
    今回は演習としてあえて複雑な置換を取り入れています。
    5) 出来上がり
    後は一般のテキスト入力で表題や、横罫線を入力すれば表らしくなります。
    	   +---------------+-----+-----+-----+
    	   |  file  name   | line| word| byte|
    	   +---------------+-----+-----+-----+
    	   |fdump.c        |   38|   89|  576|
    	   |fline.c        |   16|   29|  283|
    	   |fread.c        |   14|   27|  236|
    	   +---------------+-----+-----+-----+
    	   |total          |  259|  600| 3750|
    	   +---------------+-----+-----+-----+
    


    Next| Prev| Up| Index