Найти и заменить, используя файл sh - PullRequest
0 голосов
/ 08 августа 2011

Я пишу сценарий автоматического резервного копирования и зеркалирования, который будет более или менее копировать файлы, базу данных, разрешения на установку и слегка изменять зеркальные файлы, чтобы они работали на другом сервере с файлом резервной копии.Я написал и настроил все остальное, кроме переконфигурации.Все мои попытки потерпели неудачу, и я не знаю, как обойти это.

Итак, это подходящие строки (модифицированные для публичного использования):

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');

Нонекоторые из этих отредактированных элементов будут переменными ...

Ответы [ 3 ]

0 голосов
/ 08 августа 2011

Одинарные кавычки предотвращают подстановку, вам нужно использовать двойные кавычки. Но более того, вам нужно изменить исходную строку в регулярное выражение, потому что это то, что понимают sed и perl (и другие подобные инструменты).

Perl может фактически заменить литеральную строку в регулярное выражение для вас, как это:

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

Многократные замены, вероятно, все должны выполняться одним скриптом, будь то sed или perl или что-то еще. (Очевидно, по одному на файл назначения.) Это также должно помочь сделать скрипт более читабельным.

Более того, внесение изменений на месте кажется немного рискованным. Возможно, у вас должен быть один «исходный» файл, который вы изменяете и устанавливаете в различные пункты назначения с любыми необходимыми изменениями?

0 голосов
/ 08 августа 2011
sudo sed -i s+$REPLACESTRING10+$REPLACESTRING12+g ...
0 голосов
/ 08 августа 2011

Переменная замена внутри строк 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 s\ # ... # ... `(только первое упоминание о #).И если у вас есть символы '#' в строке назначения или в строке реплики, вам нужно будет найти другой разделитель для использования.

Это поможет, если вы используете режим отладки оболочки, например set -vx(вставить в верхней части сценария).Затем вы увидите каждую строку, как она выполняется с переменными, расширенными до их назначенных значений.

Надеюсь, это поможет.

PS, поскольку вы выглядите новым пользователем, если вы получите ответ, который поможет вам, пожалуйста, помните, чтобы пометить его как принятый и / или дать ему +(или -) как полезный ответ.

...