2010年12月23日木曜日

複数ファイル内のテキストを一括置換

研究に使用しているプログラム群をバックアップや(簡単な)バージョン管理のため、Dropboxで管理しようと思い、"program"という名前のディレクトリをDropbox/Private/の下に移動をさせた。


それに伴い、いくつかのスクリプト内で記述してあるパス表記を、"~~/Mydocument/program/~~"から"~~ /Mydocument/DropBox/Private/program/~~"に変更する必要が出てきたので、sedコマンドによって一括で置換を行なった。


置換したいファイルが一つの場合は、

sed -i "s|置換前のテキスト|置換後のテキスト|" 対象ファイル

とシンプルだが、


現在のディレクトリ以下の特定拡張子のファイル(例えば*.sh)について、一括置換したい場合は以下の通り。



#/bin/bash


SUFFIX=".sh"

ORIGINAL_TEXT="Mydocument/program"
REPLACED_TEXT="Mydocument/Dropbox/Private/program"


target_file_list=$(find . -type f -name "*${SUFFIX}" \! -name $0 )

for target_file in ${target_file_list}
do

    target_file=${target_file#./}
    nword=$(cat ${target_file} | grep ".*${ORIGINAL_TEXT}.*" | wc -l )


    if [ ${nword} -gt 0 ]; then
    echo "Taregt file name: "${target_file}
    echo "Number of replacement: "${nword}


        echo ""
        cat ${target_file} | grep ".*${ORIGINAL_TEXT}.*" --color=always
        echo -e "\n"
       
        # sed -i s/"*${ORIGINAL_TEXT}*"/"${REPLACED_TEXT}"/ ${target_file}
        sed -i "s|${ORIGINAL_TEXT}|${REPLACED_TEXT}|" ${target_file}

        echo ""
        cat ${target_file} | grep ".*${REPLACED_TEXT}.*" --color=always
        echo -e "\n"

    echo -e "------------------\n"
   
    nhit=$((${nhit} + 1))
    fi

done


echo "----Summary information----"
echo -e "Root directory for search:\t "$(pwd)
echo -e "Search text:\t\t\t "${ORIGINAL_TEXT}
echo -e "Replaced text:\t\t\t "${REPLACED_TEXT}
echo -e "Number of hit files:\t\t "${nhit}"\n"




参考サイト
http://norian.blog50.fc2.com/blog-entry-45.html

0 件のコメント:

コメントを投稿