2011-08-08 15 views
0

自動バックアップおよびミラーリングスクリプトを作成して、ファイル、db、セットアップ権限をコピーしたり、ミラーリングされたファイルを少し変更したりして、バックアップされたファイル私は再構成以外のすべてのことを書いて設定しました。すべての私の試みは失敗し、私はそれを回避する方法を知らない。shファイルを使用して検索および置換する

したがって、これらは、(公共の使用のために改変)relevent線である:

FOLDER="kf.hammertime.com.au" 
SERVER="fulcan" 
BACKUPUSER="backupclient3" 
DESTINATION="/var/www/Backup-Server" 
SOURCE="/var/www" 

RECONFIG="1" 

if [ "${RECONFIG}" = "1" ] 
then 
#Original to be replace 
echo Reconfiguring website for the mirrored site. 
REPLACESTRING10="define (\'ROOT_PATH\', \'\/var\/www\/${FOLDER}\/trunk\')" 
REPLACESTRING20="define ('DB_PASSWORD', 'hammertime1')" 
REPLACESTRING30="define ('DB_USERNAME', 'hammertime2')" 
REPLACESTRING40="define ('DB_HOST', 'localhost')" 

#String to be replaced 
REPLACESTRING11="define ('ROOT_PATH', '${SOURCE}\/${FOLDER}')" 
REPLACESTRING21="define ('DB_PASSWORD', 'hammertime3')" 
REPLACESTRING31="define ('DB_USERNAME', 'hammertime4')" 
REPLACESTRING41="define ('DB_HOST', 'hammertime5')" 

REPLACESTRING12="define (\'ROOT_PATH\', \'${SOURCE}\/${FOLDER}\/trunk\')" 

echo ${REPLACESTRING10} 

#Reconfigure various configuration files for Backup-Server active use 

#find /your/home/dir -name "*.txt" | xargs perl -pi -e 's/stringtoreplace/replacementstring/g' 

#Edits the files regardless if its in trunk or not. Will come up with errors. 

#sudo replace "${REPLACESTRING10}" "${REPLACESTRING12}" <${DESTINATION}/${FOLDER}/trunk/lib/config.php> ${DESTINATION}/${FOLDER}/trunk/lib/config2.php 

#sudo sed -i s/"${REPLACESTRING10}"/"${REPLACESTRING12}"/g ${DESTINATION}/${FOLDER}/trunk/lib/config.php 

#sudo perl -i -p -e 's{${REPLACESTRING10}}{${REPLACESTRING12}}g' ${DESTINATION}/${FOLDER}/trunk/lib/config.php 


sudo sed -i 's/${REPLACESTRING10}/${REPLACESTRING12}/g' ${DESTINATION}/${FOLDER}/trunk/lib/config.php 

#sudo sed -i 's/${REPLACESTRING10}/${REPLACESTRING11}/g' ${DESTINATION}/${FOLDER}/lib/config.php 

#sudo sed -i 's/${REPLACESTRING20}/${REPLACESTRING21}/g' ${DESTINATION}/${FOLDER}/trunk/lib/config.php 
#sudo sed -i 's/${REPLACESTRING20}/${REPLACESTRING21}/g' ${DESTINATION}/${FOLDER}/lib/config.php 

#sudo sed -i 's/${REPLACESTRING30}/${REPLACESTRING31}/g' ${DESTINATION}/${FOLDER}/trunk/lib/config.php 
#sudo sed -i 's/${REPLACESTRING30}/${REPLACESTRING31}/g' ${DESTINATION}/${FOLDER}/lib/config.php 

#sudo sed -i 's/${REPLACESTRING40}/${REPLACESTRING41}/g' ${DESTINATION}/${FOLDER}/trunk/lib/config.php 
#sudo sed -i 's/${REPLACESTRING40}/${REPLACESTRING41}/g' ${DESTINATION}/${FOLDER}/lib/config.php 
fi 

非常に短い線「須藤SED -i 'S/$ {REPLACESTRING10}/$ {REPLACESTRING12}/G' $で{DESTINATION}/$ {FOLDER} /trunk/lib/config.php "は変数を全くうまくとらない。

だから私はperlの代替を使ってみましたが、役に立たなかった(しかし、私はそれをn00bingしていた可能性があります)。私の試みのほとんどはそこにリストされています。交換するだけでなく。

1つのファイルで特定の行を変更するだけです(行番号は変更できます)。

あなたの時間と忍耐強くお祈りしています(ちなみに、これは初めてのSHスクリプトの作成ですが、私はBATに慣れていますので、私はそれを公正に詰め込んだと確信しています。それがエラーなしでうまく動作します)

EDIT: ファイルチャンクは、次のようになります。

define ('ROOT_PATH', '/var/www/kf.hammertime.com.au/trunk'); 
define ('DB_HOST', 'hammertime1'); 
define ('DB_USERNAME', 'hammertime2'); 
define ('DB_PASSWORD', 'localhost'); 

と私はそれを変更したい:

define ('ROOT_PATH', '/var/www/Backup-Server/kf.hammertime.com.au/trunk'); 
define ('DB_HOST', 'hammertime3'); 
define ('DB_USERNAME', 'hammertime4'); 
define ('DB_PASSWORD', 'hammertime5'); 

しかし、これらの編集項目のいくつかはになります変数...

答えて

0

sed文字列内の可変置換は二重引用符で囲む必要があります。つまり、あなたは

sudo sed -i 's/${REPLACESTRING10}/${REPLACESTRING12}/g' ${DESTINATION}/${FOLDER}/trunk/lib/config.php 

を持って、これを修正して、次の問題が何であるかを教え

sudo sed -i "s/${REPLACESTRING10}/${REPLACESTRING12}/g" ${DESTINATION}/${FOLDER}/trunk/lib/config.php 

と交換してください。あなたは

編集

REPLACESTRING20="define\ ('DB_PASSWORD',\ 'hammertime1')" 
# ---------------------^ --------------^ 

ようREPLACESTRINGnに埋め込まれた任意のスペースまたはタブ文字をエスケープする必要があるかもしれませんそしてもちろん、すべてのsed問題のキラーは、どちらかに埋め込まれた「/」であります検索文字列または置換文字列。ほとんどのSEDSは「/」以外の他の文字を使用できるように、その一部SEDS

sudo sed -i "s#${REPLACESTRING10}#${REPLACESTRING12}#g" ${DESTINATION}/${FOLDER}/trunk/lib/config.php 

を試してみてください#\それは「/」でない場合は、最初の文字をエスケープしている「と主張」、そう単純s#...#...#g' doesn't work, tryの場合.. 。#... `(ちょうど#の最初の言及)。あなたのターゲット文字列またはrepl文字列に '#'文字がある場合、使用する別の区切り文字を見つける必要があります。

シェルデバッグモードを使用すると、set -vx(スクリプトの一番近くに挿入)のようになります。次に、変数が割り当てられた値に展開されて実行されるごとに、各行が表示されます。

こちらがお役に立てば幸いです。

P.S.あなたが新しいユーザーのように見えるように、あなたがそれを受け入れられたものとして覚えておいてください、そして/または役に立つ答えとして+(または - )を付けるのを助ける答えを得たら。

+0

がOKまあ、私はこれを取得:------ sudoのsedの-iの定義/ \ '\ '' のroot_path \' \ '\、\' \」 '/ var/www \ /jb.qk.com.au \ /トランク\' \ '' /定義\ '\' 'ROOT_PATH \' \ ''、\ '\' '/ var/www \/jb .qk.com.au \/trunk \ '\' '/' /var/www/Backup-Server/jb.qk.com.au/trunk/lib/config.php sed:-e expression#1、 char 87: 's 'に未知のオプション----- 私は何をエスケープしていませんか? – Mattisdada

+0

私のリビジョンを参照してください。がんばろう。 – shellter

+0

最後の編集はそれでした。非常にありがとうございました:)。私はそれを理解できなかったら私の髪を裂くつもりでした..... – Mattisdada

0

一重引用符は置換を防ぐため、二重引用符を使用する必要があります。しかし、何よりも、ソース文字列を正規表現に変更する必要があります。これは、sedperl(および他の同様のツール)が理解しているためです。

Perlは実際にこのように、あなたのための正規表現にリテラル文字列を変更することができます、

perl -pi -e 'BEGIN { $src = quotemeta(shift @ARGV); } 
    s/$src/'"${REPLACESTRING12}/g" "$REPLACESTRING10" file 

複数の置換は、おそらくすべてが単一のスクリプトによって行われるべきであること、それsedまたはperlまたは何か他のもの。 (目的地のファイルごとに1つ、明らかに)これはスクリプトをより読みやすくするのに役立ちます。

さらに、インプレース編集を行うのは少し危険です。おそらく、必要な変更を加えてさまざまな宛先に変更してインストールする1つの「ソース」ファイルを用意する必要があります。私はあなたの提案をしようとしたとき

+1

2つのファイルに同じ変更を加えるつもりはありますか?その場合は、明らかに両方のファイルに同じ置換スクリプトを適用してください。最終結果がどのようなものであるべきかをあなたの例から説明するのは難しいです。 – tripleee

0
sudo sed -i s+$REPLACESTRING10+$REPLACESTRING12+g ... 
関連する問題