編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

bulk sed

#!/bin/sh

# ============================================================================
# 一括置換スクリプト
# ============================================================================

# ----------------------------------------------------------------------------
# 初期設定
# ----------------------------------------------------------------------------

# 置換したファイルを出力するディレクトリ
save_dir=/tmp/save
# 置換する文字列(置換前文字列 置換後文字列)
texts='
test TEST
sample Sample
'

# ----------------------------------------------------------------------------
# メイン
# ----------------------------------------------------------------------------
IFS='
'

if [ "$1" = "-debug" ]; then
  debug=1
  shift
elif [ "$1" = "-echo" ]; then
  echo=1
  shift
fi

# saveディレクトリを削除しておく
if [ -e $save_dir ]; then
    rm -rf $save_dir
fi
if [ ! -d $save_dir ]; then
    mkdir -p $save_dir
fi

# 引数からfind コマンドの対象ディレクトリを組み立てる
target_dir=`pwd`
target_dir=`echo $target_dir/$1 | sed -e 's/\/$//'`
esc_target_dir=`echo $target_dir | sed -e 's/\//\\\\\//g'`
if [ ! -d $target_dir ]; then
  echo "usage: $0 [ -debug | -echo ] DIR"    
  exit 1
fi

# tmpディレクトリを作り、対象ディレクトリ以下のファイルをコピーする
tmp_dir=/tmp/tmp
esc_tmp_dir=`echo $tmp_dir/ | sed -e 's/\//\\\\\//g'`
if [ -e $tmp_dir ]; then
    rm -rf $tmp_dir
fi
if [ ! -d $tmp_dir ]; then
    mkdir -p $tmp_dir
fi
cp -a $target_dir/* $tmp_dir/

# findを実行して対象のファイルを抽出する
tmp_files=`find $tmp_dir ! -path '*.svn*' -type f`

echo -n "wait"
for text in $texts; do
  echo -n "."
  # 置換文字列を組み立てる
  text1=`echo $text | cut -f 1 -d ' '`
  text2=`echo $text | cut -f 2 -d ' '`
  for tmp_file in $tmp_files; do
    # grepしてsedすべきか調べる
    if grep "$text1" $tmp_file >/dev/null; then
      if [ "$debug" ]; then
        grep "$text1" $tmp_file /dev/null
        continue
      fi
      # 出力するファイルのパスを作る
      # パス中のディレクトリがなければここで作る
      save_path=`echo $tmp_file | sed -e s/^$esc_tmp_dir//`
      d=`dirname $save_dir/$save_path`
      if [ ! -e $d ]; then
        mkdir -p $d
      fi
      # sedを実行
      if [ "$echo" ]; then
        echo sed -e \"s/$text1/$text2/g\" $tmp_file \> $save_dir/$save_path
        echo cp $save_dir/$save_path $tmp_file
      else
        sed -e "s/$text1/$text2/g" $tmp_file > $save_dir/$save_path
        cp $save_dir/$save_path $tmp_file
      fi
    fi
  done
done

if [ ! "$echo" ]; then
  echo
  echo "done. saved to: $save_dir"
  rm -rf $tmp_dir
fi

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Last-modified: 2006-12-27 (水) 20:08:06 (4040d)