Не удалось запустить sed на скрипте bash

Я работаю через какой-то старый код, который не работает, я наткнулся на часть, которая вызывает проблемы. Я надеялся, что кто-то может помочь мне и заполнить меня тем, что является точным функционалом этой небольшой части скрипта и что может привести к сбою / не выполнению. Если я запускаю первый файл .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 что-то делать с удержанием и узорами шаблона? и вставить содержимое?

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

Спасибо за помощь всем.

1
задан 17 September 2014 в 14:28

2 ответа

@ 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.

1
ответ дан 24 May 2018 в 03:39

Вы не совсем правы относительно значения параметров 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.

1
ответ дан 24 May 2018 в 03:39
  • 1
    Спасибо, что разъяснил это мне. Это было очень полезно – user1054844 17 September 2014 в 11:49

Другие вопросы по тегам:

Похожие вопросы: