2008年1月31日木曜日

文字列置換ツール(無保証)

文字列置換ツールを作成しました。
時折必要性を感じるのですが、その場でさっさと作るには難しいシェルです。
かといって胸を張って公開できるようなツールでもありませんが。

当ツールは完全無保証です。ファイルが壊れるかもしれません。脅しではありません。バイナリファイルは、例え検索結果にマッチしなくても、無条件に破壊します。注意して使ってください。

私的なメモとして貼っておきます。
#!/bin/ksh
trgt_dir=$1
trgt_ext=$2
str_search=$3
str_replace=$4
self=`basename $0`
USED=0
use_parcent=0
use_slash=0

w_list_file=/tmp/tmp.$$.dirlist
w_tmp_file=/tmp/tmp.$$.aft

usage() {
echo "$self [PATH] [対象拡張子] [検索文字列] [置換文字列]"
echo "注意:バイナリファイルは破壊されます。"
echo "注意:'/'と'%'を同時に使うことはできません。"
}

# 引数チェック
if (( $# <= 2 )); then
usage;
return 0
fi

if [[ ! -d $trgt_dir ]]; then
echo "第一引数が有効なディレクトリではありません";
usage
return 1
fi

# sedで使う'/'あるいは'%'が含まれないことを確認。
echo $str_search $str_replace | grep '/' > /dev/null 2>&1
use_slash=$?
echo $str_search $str_replace | grep '%' > /dev/null 2>&1
use_percent=$?

if (( $use_slash == $USED && $use_percent == $USED )); then
echo "'/'と'%'を同時に使うことはできません。"
return 1
fi
echo "警告> ファイルのタイムスタンプは全て現在の時間に更新されます。"
if (( $# == 3 )); then
echo "警告> 置換文字列が指定されていません。"
echo "警告> 文字列[$str_search]をファイルから削除しますがよろしいですか?[Y/y] : "
read input
if [[ $input != "Y" && $input != "y" ]]; then
echo "終了します"
return 0
fi
fi

echo "警告> ${trgt_dir}/ にある *.${trgt_ext} がバイナリファイルであれば、"
echo "警告> *.${trgt_ext} は問答無用で破壊されます。よろしいですか?[Y/y]"
read input
if [[ $input != "Y" && $input != "y" ]]; then
echo "終了します"
return 0
fi
echo "警告> 本当に?[Y/y]"
read input
if [[ $input != "Y" && $input != "y" ]]; then
echo "終了します"
return 0
fi

ls -l $trgt_dir | grep -v $self | grep ^- | grep \.${trgt_ext}$ |
awk -vDIR=${trgt_dir} '{print DIR"/"$NF}' > $w_list_file

while read trgt_file
do
if (( $use_slash == $USED )); then
cat $trgt_file | sed "s%${str_search}%${str_replace}%g" > $w_tmp_file
else
cat $trgt_file | sed "s/${str_search}/${str_replace}/g" > $w_tmp_file
fi
mv $w_tmp_file $trgt_file
echo "$trgt_file を処理しました。"
done < $w_list_file

rm $w_list_file

0 件のコメント: