Я работаю через какой-то старый код, который не работает, я наткнулся на часть, которая вызывает проблемы. Я надеялся, что кто-то может помочь мне и заполнить меня тем, что является точным функционалом этой небольшой части скрипта и что может привести к сбою / не выполнению. Если я запускаю первый файл .sql в командной строке, все работает отлично, и я использую те же sql-логины, что и скрипт.
У меня есть файл update.sh, который запускается каждую ночь и принимает забота об обновлении информации о клиенте. Когда мы добавляем клиентов в файл, где он читает данные, он не может генерировать новые экземпляры базы данных и хранимых процедур.
фрагмент кода:
#!/bin/bash
mysql_host="localhost"
mysql_id="root"
mysql_pwd="sudopwd"
read_dom () {
local IFS=\>
read -d \< ENTITY CONTENT
}
.
Some functioning code
.
.
Here is the part that does not work
sed -i "s/tk[0-9]*;/tk$company_id;/1i" resources/sql/create_tk.sql
mysql -h $mysql_host -u $mysql_id "-p$mysql_pwd" < resources/sql/create_tk.sql
sed -i "s/tk[0-9]*/tk$company_id/gi" resources/sql/load_data_tk.sql
mysql -h $mysql_host -u $mysql_id "-p$mysql_pwd"< resources/sql/load_data_tk.sql
fi
done < info.xml
EN_MO=$(date +%s)
DIFF_MO=$[$EN_MO-$ST_MO]
C_DATE=$(date +"%Y%m%d%H%M")
Если я правильно понимаю, первая часть -i означает изменение (изменение базы данных, используемой в скрипте) create_tk.sql.
-i означает, что он выполняется рекурсивно для каждой компании
/ 1i означает сохранение tk [0-9] *; / tk $ company_id; часть строки? и Вставить содержимое?
/ 1i что-то делать с удержанием и узорами шаблона? и вставить содержимое?
Я был бы очень признателен, если бы кто-то мог уточнить точный смысл этого фрагмента и указать, что может вызвать невозможность выполнить его функцию.
Спасибо за помощь всем.
@ Oli рассказал вам, почему он, вероятно, не работает, поэтому я просто объясню код sed:
sed -i "s/tk[0-9]*;/tk$company_id;/1i"
s/PATTERN/REPLACEMENT/FLAGS - это оператор подстановки. Он заменит PATTERN на REPLACEMENT. [F6] (например, g в s///g) может изменить свое поведение. Здесь флаги N (1 в вашем примере), что означает «Заменить только N-й матч PATTERN (это странно, флаг N обычно используется для замены N-го совпадения, где N больше то 1. Я не понимаю, почему это необходимо здесь, sed заменит только первое совпадение по умолчанию). И i, который делает совпадение нечувствительным к регистру.
Ваш второй sed имеет флаги g и i. i не учитывает регистр, и g делает замену глобальной, она будет применяться ко всем совпадениям в текущей строке. Без нее будет только первый поэтому я не вижу в предыдущем примере точку флага 1.
Вы не совсем правы относительно значения параметров sed. Позвольте мне сначала объяснить их, тогда мы поймем, что делает ваш код.
Опция -i означает: вместо отображения результата обработки sed на терминале, напишите его в файл. Синтаксис s / regexp / replacement /. Это означает, что sed заменит строки, соответствующие регулярному выражению (regexp), содержимым замены.Символы после последнего / являются модификаторами, они влияют на то, как sed обрабатывает строки:
Опция -i означает: вместо отображения результата обработки sed на терминал, напишите его в файл. -i означает «Только заменить первое совпадение регулярного выражения». s / синтаксис - s / regexp / replacement /. Это означает, что sed заменит строки, соответствующие регулярному выражению (regexp), содержимым замены./ и / 1i являются комбинациями этих.
Итак, в вашем коде эта строка:
sed -i "s/tk[0-9]*;/tk$company_id;/gi" resources/sql/create_tk.sql
будет переводить (читать как одно предложение):
-i означает «Только заменить первое совпадение регулярного выражения». substitute ( ] s / ) все строки (/ g), начинающиеся с tk (верхние или нижние символы / i), в конечном счете сопровождаемые числом, затем за ним следует двоеточие с помощью строки tk, за которой следует содержимое переменной $ company_id, за которым следует точка с запятойИсточник: https://www.gnu.org/software/sed/manual/html_node/The-_0022s_0022-Command.html и справочная страница sed.