Как заменить $ {} заполнителей в текстовом файле? - PullRequest
125 голосов
/ 06 января 2009

Я хочу направить вывод файла шаблона в MySQL, в котором переменные типа ${dbName} разбросаны. Что такое утилита командной строки для замены этих экземпляров и вывода вывода на стандартный вывод?

Ответы [ 15 ]

3 голосов
/ 23 февраля 2016

Я бы предложил использовать что-то вроде Sigil : https://github.com/gliderlabs/sigil

Он скомпилирован в один двоичный файл, поэтому его очень легко установить в системах.

Тогда вы можете сделать простой однострочный, как показано ниже:

cat my-file.conf.template | sigil -p $(env) > my-file.conf

Это намного безопаснее, чем eval и проще, чем регулярное выражение или sed

2 голосов
/ 12 июля 2014

Здесь много вариантов, но я решил бросить свой в кучу. Это основано на Perl, только целевые переменные вида $ {...}, принимает файл для обработки в качестве аргумента и выводит преобразованный файл на стандартный вывод:

use Env;
Env::import();

while(<>) { $_ =~ s/(\${\w+})/$1/eeg; $text .= $_; }

print "$text";

Конечно, я на самом деле не Perl человек, поэтому легко может быть фатальный недостаток (работает для меня, хотя).

2 голосов
/ 16 мая 2011

Я нашел эту ветку, удивляясь тому же. Это вдохновило меня на это (осторожно с галочкой)

$ echo $MYTEST
pass!
$ cat FILE
hello $MYTEST world
$ eval echo `cat FILE`
hello pass! world
2 голосов
/ 06 января 2009

Это можно сделать в самом bash, если у вас есть контроль над форматом файла конфигурации. Вам просто нужно найти (".") Файл конфигурации, а не его оболочку. Это гарантирует, что переменные создаются в контексте текущей оболочки (и продолжают существовать), а не подоболочки (где переменная исчезает при выходе из подоболочки).

$ cat config.data
    export parm_jdbc=jdbc:db2://box7.co.uk:5000/INSTA
    export parm_user=pax
    export parm_pwd=never_you_mind

$ cat go.bash
    . config.data
    echo "JDBC string is " $parm_jdbc
    echo "Username is    " $parm_user
    echo "Password is    " $parm_pwd

$ bash go.bash
    JDBC string is  jdbc:db2://box7.co.uk:5000/INSTA
    Username is     pax
    Password is     never_you_mind

Если ваш конфигурационный файл не может быть сценарием оболочки, вы можете просто «скомпилировать» его перед выполнением (компиляция зависит от вашего формата ввода).

$ cat config.data
    parm_jdbc=jdbc:db2://box7.co.uk:5000/INSTA # JDBC URL
    parm_user=pax                              # user name
    parm_pwd=never_you_mind                    # password

$ cat go.bash
    cat config.data
        | sed 's/#.*$//'
        | sed 's/[ \t]*$//'
        | sed 's/^[ \t]*//'
        | grep -v '^$'
        | sed 's/^/export '
        >config.data-compiled
    . config.data-compiled
    echo "JDBC string is " $parm_jdbc
    echo "Username is    " $parm_user
    echo "Password is    " $parm_pwd

$ bash go.bash
    JDBC string is  jdbc:db2://box7.co.uk:5000/INSTA
    Username is     pax
    Password is     never_you_mind

В вашем конкретном случае вы можете использовать что-то вроде:

$ cat config.data
    export p_p1=val1
    export p_p2=val2
$ cat go.bash
    . ./config.data
    echo "select * from dbtable where p1 = '$p_p1' and p2 like '$p_p2%' order by p1"
$ bash go.bash
    select * from dbtable where p1 = 'val1' and p2 like 'val2%' order by p1

Затем перенаправьте вывод go.bash в MySQL и вуаля, надеюсь, вы не уничтожите свою базу данных: -).

0 голосов
/ 30 марта 2019

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

Используя пример template.txt с содержимым:

The number is ${i}
The word is ${word}

Следующая строка заставит оболочку интерполировать содержимое template.txt и записать результат в стандартный вывод.

i='1' word='dog' sh -c 'echo "'"$(cat template.txt)"'"'

Пояснение:

  • i и word передаются как переменные среды, привязанные к выполнению sh.
  • sh выполняет содержимое переданной строки.
  • Строки, записанные рядом друг с другом, становятся одной строкой, эта строка:
    • 'echo "' + "$(cat template.txt)" + '"'
  • Поскольку подстановка находится между ", "$(cat template.txt)" становится выходным значением cat template.txt.
  • Таким образом, команда, выполняемая sh -c, становится:
    • echo "The number is ${i}\nThe word is ${word}"
    • где i и word - указанные переменные среды.
...