Next| Prev|Index|凡例


B.6 vi を補足するツールの作成

vi の ! コマンドは指定された範囲のメインバッファの内容を指定されたプログラムの標準入力へ引き渡します。
また r! であれば、その結果をさらにメインバッファの内容と置換します。 よって標準入力からデータをうけ加工し標準出力へ引き渡すフィルタープログラムは vi との連携が可能となります。
1. センターリングツール
C言語による、センタリングを行うフィルタープログラムサンプル。
引き数として行の幅が指定できます(省略値は80)。

ソースリスト:cntr.c [source]

/* +--------------------------------------------+ */
/* |@(#) cntr: usage [width:-80]                | */
/* +--------------------------------------------+ */
#include <stdio.h>
#include <strings.h>
#include <sys/types.h>
#define BMAX	2048
#define WIDTH	 80

char	*verid = "%Z% VAU-1 cntr by ycos %I%";

/*  Error message print */
/*    erprint(prog, message), output stderr */
void erprt( char *prog, char *msg )
{
	fprintf(stderr,"\n%s:%s\n", prog, msg );
	exit(1);
}

main( int argc, char *argv[] )
{
	FILE	*ipt;	/* Input file discripter */
	int	 len,	/* length of input line */
		 mgn,	/* right mergin 	*/
		 wid,	/* output width 	*/
		 i;
	char	buf[BMAX];	/* I/O buffer per 1 line*/

	/* Arguments check( none, width or width filename ) */
	switch( argc ) {
	case 1:
		ipt = stdin;
		wid = WIDTH;
		break;
	case 2:
		ipt = stdin;
		wid = atoi( argv[1] );
		break;
	case 3:
		ipt = fopen(argv[2], "r");
		if( ipt == NULL ) erprt(argv[0],"input file error");
		break;
	default:
		erprt(argv[0],"[ width [file name] ]");
		break;
	}

	if( wid < 3 || wid > BMAX ) erprt(argv[0],"range check. width");

	for(;;){
		if( fgets(buf, BMAX, ipt ) == NULL ) break;
		len = strlen(buf);
		if( wid > len ) {
			mgn = (wid - len ) / 2;
			for(i=0;i<mgn;i++){
				fputc(' ',stdout);
			}
		}
		fputs(buf,stdout);
	}
}
2. HTML作表スクリプト
ksh と awk によるシェルスクリプトで、入力したデータを HTML 形式の表 ( <table>タグ )に変換します。
引数にオプションとして -ddelimiter にてデータの区切り文字を指定します。
スクリプト: htbl.ksh
#! /bin/ksh
# @(#) Create HTML table / usage [-d<DELIMITER>] FILES..
#

DCHAR="	" 
while getopts :hd: n 
do
	case $n in
	d) DCHAR=$OPTARG ;;
	h) cat <<"EOF" >&2
	   $0 [-h][-d DELIMITER_CHAR ] FILES...
EOF
		;;
	?) echo " unkown $n" ;;
	esac
done
shift OPTIND-1

gawk -F"$DCHAR" 'BEGIN{
	print "<table border=1>"
}
function line()
{
	print "<tr>"
	for(i=1;i<=NF;i=i+1) printf "<%s>%s</%s>\n",
		tag, $i, tag
	print "</tr>"
}
NR==1{
	print "<tr>"
	for(i=1;i<=NF;i=i+1) printf "<%s>%s<%s>\n",
		"th", $i, "/th"
	print "</tr>"
	next
}
{
	print "<tr>"
	for(i=1;i<=NF;i=i+1) {
		if ( $i + 0 == $i ) {
			printf "<%s>%s<%s>\n", "td align=right", $i, "/td"
		} else {
			printf "<%s>%s<%s>\n", "td align=left", $i, "/td"
		}
	}
	print "</tr>"
}END{
	print "</table>"
}' $*

実行例
	#,name,address
	123,yamada,ayama@hoge.com
	5,sato,eisaku.sato@sore.co.jp
		↓1G!Ghtbl.ksh -d, 
	<table border=1>
	<tr>
	<th>#</th>
	<th>name</th>
	<th>address</th>
	</tr>
	<tr>
	<td align=right>123</td>
	<td align=left>yamada</td>
	<td align=left>ayama@hoge.com</td>
	</tr>
	<tr>
	<td align=right>5</td>
	<td align=left>sato</td>
	<td align=left>eisaku.sato@sore.co.jp</td>
	</tr>
# name address
123 yamada ayama@hoge.com
5 sato eisaku.sato@sore.co.jp


Next| Prev| Up| Index