2011-08-08 447 views
0

我写了一个自动备份和镜像脚本,它将或多或少地复制文件,数据库,安装权限并稍微修改镜像文件,以便它们可以在另一台服务器上工作备份的文件。除了重新配置之外,我已经编写并设置了其他所有内容。我所有的尝试都失败了,我不知道如何解决它。使用sh文件查找和替换

因此,这些都是在培训相关线(改性供公众使用的):

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的/ $ {REPLACESTRING10}/$ {REPLACESTRING12}/G'$ {DESTINATION}/$ {FOLDER} /trunk/lib/config.php“并没有很好地吸收变量。因此,我尝试使用Perl的替代方法,但无济于事(但我可能已经n00bing它)。我的大部分尝试都列在那里。以及替换。

我只需要在单个文件中更改某些行(行编号可以更改)。

在此先感谢您的时间和耐心(顺便说一下,这是第一次写SH脚本,我习惯了BAT,所以我确信我已经记录了一小部分,但它不出差错效果很好)

编辑: 文件块的样子:

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 

修复此,然后告诉我们接下来的问题是什么。您可能需要逃避嵌入REPLACESTRINGn任何空间或选项卡字符像

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

编辑

和当然,所有的sed问题的杀手锏,是嵌入式“/”在任搜索字符串或替换字符串。大多数SEDS允许使用其它字符除了“/”,所以尽量

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

一些SEDS“坚持”,你逃脱的第一个字符,如果它不是“/”,所以如果只是普通的s#...#...#g' doesn't work, try小号\#.. #...`(只是第一次提到#)。如果您的目标字符串或repl字符串中有'#'字符,那么您必须找到一个不同的分隔符才能使用。

如果您使用shell调试模式,即set -vx(插入靠近脚本顶部),它将有所帮助。然后你会看到每一行,因为它的变量被扩展为它们的赋值。

我希望这会有所帮助。

P.S.因为你似乎是一个新用户,如果你得到一个可以帮助你的答案,请记住将它标记为已接受,并且/或者给它一个+(或 - )作为有用的答案。

+0

玉以及当我想你的建议,我得到这样的:------ 须藤SED -i 'S /定义\' \ '' ROOT_PATH \'\ '\,\' \” '\/var \/www \ /jb.qk.com.au \/trunk \''/ define \''ROOT_PATH \'\'',\'\''/ var/www \/jb .qk.com.au \/trunk \'''/ g'/var/www/Backup-Server/jb.qk.com.au/trunk/lib/config.php sed:-e expression#1,字符87:未知选项's'----- 我不逃避什么? – Mattisdada

+0

请参阅我的修订。祝你好运。 – shellter

+0

最后的编辑是它。非常感谢你 :)。我想把我的头发撕掉,如果我不能找出那一个..... – Mattisdada

0

单引号阻止替换,您需要使用双引号。但更重要的是,您需要将源字符串更改为正则表达式,因为这是sedperl(以及其他类似工具)所理解的。

的Perl实际上可以改变一个字符串成一个正则表达式的你,就像这样:

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

的多个替换也许应该全部由一个单一的脚本来完成,无论是sedperl或别的东西。 (显然每个目标文件一个。)这应该有助于使脚本更具可读性。

此外,进行就地编辑似乎有点冒险。也许你应该有一个“源”文件,你可以修改并安装到不同的目的地,无论你需要什么样的修改?

+1

你打算在两个文件中做出相同的更改?如果是这样,显然应用相同的替换脚本到这两个文件。从你的例子很难说出最终结果应该是什么。 – tripleee

0
sudo sed -i s+$REPLACESTRING10+$REPLACESTRING12+g ...