Не способный выполнить sed на сценарии удара

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

/s средства, что это сделано рекурсивно к каждой компании

/1i средства сохраняют tk [0-9] *;/tk$company_id; часть строки? и Вставьте содержание?

/gi что-то, чтобы сделать с хранением и пробелами шаблона? и Вставьте содержание?

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

Спасибо за справку все.

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

3 ответа

У меня есть update.sh файл, который выполняется каждую ночь

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

Это точно, что Вы делаете. Все Ваш sed команды используют относительные пути, таким образом, они работают, когда Вы находитесь в корректном каталоге... Но cron в том же каталоге?Наверное, нет.

У Вас есть выбор мер здесь:

  1. Используйте полные пути во всех своих командах сценариев как /home/bob/dir/file
  2. Сделайте свой сценарий cd в правильный каталог (используют полный путь) наверху сценария.
  3. Сделайте свою команду крона cd в корректный каталог перед работой, например:

    00 00 * * *   cd /home/bob && ./update.sh
    

На комментарии о полномочиях, если у Вас нет полномочий записи сделать оперативное sed, Вы могли просто произвести к где-нибудь, где у Вас действительно есть полномочия записи, например:

sed "s/tk[0-9]*;/tk$company_id;/1i" resources/sql/create_tk.sql > $HOME/temp.sql
mysql -h $mysql_host -u $mysql_id "-p$mysql_pwd" < $HOME/temp.sql
rm $HOME/temp.sql#

Или Вы могли на самом деле просто передать по каналу от sed в mysql:

sed "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/*.sql файлы поэтому, если необходимо отредактировать их, необходимо устранить проблемы полномочий (независимо от того, что они; использовать stat filename видеть, что продолжается),

3
ответ дан 10 November 2019 в 18:23

@Oli сказал Вам, почему он, вероятно, перестал работать так, я просто объясню sed код:

sed -i "s/tk[0-9]*;/tk$company_id;/1i"

s/PATTERN/REPLACEMENT/FLAGS оператор замены. Это заменит PATTERN с REPLACEMENT. FLAGS (например, g в s///g) может изменить его поведение. Здесь, флаги N (1 в Вашем примере), что означает "Замену только Энное соответствие ШАБЛОНА (это странно, N флаг обычно используется для замены Энного соответствия где N больше затем 1. Я не вижу, почему это необходимо здесь, sed заменит только первое соответствие по умолчанию). И i который делает соответствие нечувствительным к регистру.

Ваша секунда sed имеет флаги g и i. i нечувствительное к регистру соответствие и g делает замену глобальной, она будет применена ко всем соответствиям в текущей строке. Без него только было бы заменено первое, который является, почему я не вижу точку 1 флаг в предыдущем примере.

1
ответ дан 10 November 2019 в 18:23

Вы не совершенно правы относительно значения sed опции. Позвольте мне сначала объяснить их затем, мы поймем то, что делает Ваш код.

  • Опция-i средства: вместо того, чтобы отобразить результат sed, обрабатывающего на терминале, запишите это в файл.
  • синтаксис s/является s/regexp/replacement/. Это означает, что sed заменит строками, соответствующими регулярному выражению (regexp) содержанием замены.

Символы после последнего / являются модификаторами, они влияют, как sed обработает строки:

  • /g означает, "Применяют замену ко всем соответствиям к regexp, не просто первое".
  • /1 означает, "Только заменяют первое соответствие regexp".
  • /i для нечувствительного к регистру

/gi и/1i являются комбинациями тех.

Таким образом в Вашем коде, этой строке:

sed -i "s/tk[0-9]*;/tk$company_id;/gi" resources/sql/create_tk.sql

перевел бы (чтение как одно предложение):

  • В resources/sql/create_tk.sql файле (-i опция)
  • замена (s/)
  • все строки (/g)
  • запуск с tk (верхние или более низкие символы/i), в конечном счете сопровождаемый числом, затем сопровождаемым точкой с запятой
  • строкой tk сопровождаемый содержанием переменного $company_id, сопровождаемого точкой с запятой

Источник: https://www.gnu.org/software/sed/manual/html_node/The-_0022s_0022-Command.html и страница справочника sed.

1
ответ дан 10 November 2019 в 18:23

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

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