2009年5月20日水曜日

nkf拡張シェルスクリプト

普段はMac、外や研究室ではWindows、実験ではLinuxと環境を使い分けていると、文字コードに悩まされることがある。
そんなときの強い味方、Network Kanji Filter : nkfであるが、複数のファイルを一度に変換するにはいちいち面倒くさい。
どうせならフォルダ内の対応したファイルを全て変換したいっ!

そんな煩わしさを解消するシェルスクリプトを書いてみた。
ソースは続きから。


「あるディレクトリのC++ファイル(.*\.hや.*\.cpp)を全てunicodeに変換したい!」場合の使い方は以下。

 nkf.sh -w -d -r ディレクトリ名

オプション-dでディレクトリ指定を。-rで元のファイルの削除を。-w/-sでutf-8/sjisの変換を行う。
もちろん単一ファイルも対応可能で、その際は-dオプションを外せばよい。

 nkf.sh -w -r ファイル名

.*\.h、.*\.cpp、.*\.txtファイルを対象としているが、適宜ソースを編集すればOK。
nkfのオプションも適宜編集のこと。
ソースはこんな感じ。もっと短く書けるだろうなぁ。



#!/bin/sh
#extended nkf
#Author:Takaaki
#Last update:09/05/20

is_rm=0 # whether remove original files or not defalt:false
is_dir=0 # whether $1 is a directory or not defalt:false
nkf_opt="" # format for nkf
while getopts "rdsw" opt; do

case $opt in
r ) is_rm=1 ;;
d ) is_dir=1 ;;
s ) nkf_opt="-s" ;;
w ) nkf_opt="-w" ;;
\? ) echo 'usage: nkf -format [-r] [-d] args'
exit 1
esac

done

shift $(($OPTIND - 1))

if [ $nkf_opt = ""];then
 echo 'usage: -format must be given (-w / -s)'
 exit 1
fi

if [ $is_dir = 1 ];then
 for file in $(ls $1);do
  ext=`echo $file | sed -e "s/.*\.\([^\.]*\)\$/\1/g"`
  if [ "$ext" = "cpp" -o "$ext" = "h" -o "$ext" = "txt" ];then
   if [ $is_rm = 1 ];then
    nkf $nkf_opt $1/$file > $1/$file~
    mv $1/$file~ $1/$file
   else
    filename=`echo $file | sed -e "s/\.$ext//g"`
    nkf $nkf_opt $1/$file > $1/$filename~.$ext
   fi
  fi
 done
else
 ext=`echo $1 | sed -e "s/.*\.\([^\.]*\)\$/\1/g"`
 if [ "$ext" = "cpp" -o "$ext" = "h" -o "$ext" = "txt" ];then
  if [ $is_rm = 1 ];then
   nkf $nkf_opt $1 > $1~
   mv $1~ $1
  else
   filename=`echo $1 | sed -e "s/\.$ext//g"`
   nkf $nkf_opt $1 > $filename~.$ext
  fi
 fi
fi



0 件のコメント:

コメントを投稿