我正在编写一个自动备份和镜像脚本,它或多或少会复制文件,数据库,设置权限,并稍微修改镜像文件,以便它们在备份文件的另一台服务器上工作。除了重新配置之外,我已经编写并设置了其他所有内容。我的所有尝试都失败了,我不知道如何绕过它。
所以这些是相关的(修改后供公众使用):
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
所以简而言之就是“sudo sed -i's / $ {REPLACESTRING10} / $ {REPLACESTRING12} / g'$ {DESTINATION} / $ {FOLDER} /trunk/lib/config.php”这一行没有采取行动在变量中非常好。
所以香港专业教育学院尝试使用perl替代方案,但无济于事(但我本来可以使用它)。我的大多数尝试都列在那里。以及替换。
我只需要在单个文件中更改某些行(行号可以更改)。
提前感谢你的时间和耐心(顺便说一下,这是第一次写一个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 :(得分: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
解决此问题,然后告诉我们下一个问题是什么。您可能需要转义嵌入在REPLACESTRING中的任何空格或制表符,如
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
s \#...#...`(只是第一次提到#) 。如果你的目标或repl字符串中有'#'字符,那么你必须找到一个不同的分隔符来使用。
如果您使用shell调试模式,即set -vx
(在脚本顶部附近插入),将会有所帮助。然后,您将看到执行时的每一行,并将变量扩展为指定的值。
我希望这会有所帮助。
P.S。因为您似乎是新用户,如果您得到的答案可以帮助您,请记住将其标记为已接受,并且/或者给它一个+(或 - )作为有用的答案。
答案 1 :(得分:0)
单引号可防止替换,您需要使用双引号。但更重要的是,您需要将源字符串更改为正则表达式,因为这是sed
和perl
(以及其他类似工具)所理解的内容。
Perl实际上可以将文字字符串更改为正则表达式,如下所示:
perl -pi -e 'BEGIN { $src = quotemeta(shift @ARGV); }
s/$src/'"${REPLACESTRING12}/g" "$REPLACESTRING10" file
多个替换应该全部由单个脚本完成,无论是sed
还是perl
还是其他。 (显然,每个目标文件一个。)这应该有助于使脚本更具可读性。
此外,进行就地编辑似乎有点冒险。也许您应该有一个“源”文件,您可以修改并安装到各个目的地并进行所需的任何修改?
答案 2 :(得分:0)
sudo sed -i s+$REPLACESTRING10+$REPLACESTRING12+g ...