Sed!
Данный template.txt:
The number is ${i} The word is ${word}
мы просто должны сказать:
sed -e "s/\${i}/1/" -e "s/\${word}/dog/" template.txt
Благодаря Jonathan Leffler для подсказки для передачи приблизительно -e
аргументы тому же sed
вызов.
Это может быть сделано в самом ударе, если Вы имеете контроль над форматом файла настройки. Просто необходимо получить (". ") конфигурационный файл, а не подоболочка это. Это гарантирует, что переменные создаются в контексте текущей оболочки (и продолжите существовать), а не подоболочка (где переменная исчезают, когда подоболочка выходит).
$ 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 '^ В Вашем конкретном случае, Вы могли использовать что-то как:
$ 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 и вуаля, надо надеяться, Вы не уничтожите свою базу данных :-).
| 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 и вуаля, надо надеяться, Вы не уничтожите свою базу данных :-).
Используйте /bin/sh
. Создайте маленький сценарий оболочки, который устанавливает переменные, и затем проанализируйте шаблон с помощью самой оболочки. Как так (редактируют для обработки новых строк правильно):
the number is ${i}
the word is ${word}
#!/bin/sh
#Set variables
i=1
word="dog"
#Read in template one line at the time, and replace variables (more
#natural (and efficient) way, thanks to Jonathan Leffler).
while read line
do
eval echo "$line"
done < "./template.txt"
#sh script.sh
the number is 1
the word is dog
Если бы Вы открыты для использования Perl, который был бы моим предложением. Хотя существует, вероятно, некоторый sed и/или эксперты AWK, которые, вероятно, знают, как сделать это намного легче. Если у Вас есть более сложное отображение с больше, чем просто dbName для Ваших замен, Вы могли бы расширить это довольно легко, но Вы могли бы точно также поместить его в стандартный сценарий Perl в той точке.
perl -p -e 's/\$\{dbName\}/testdb/s' yourfile | mysql
Короткий сценарий Perl, чтобы сделать что-то немного более сложное (обрабатывают несколько ключей):
#!/usr/bin/env perl
my %replace = ( 'dbName' => 'testdb', 'somethingElse' => 'fooBar' );
undef $/;
my $buf = <STDIN>;
$buf =~ s/\$\{$_\}/$replace{$_}/g for keys %replace;
print $buf;
Если Вы называете вышеупомянутый сценарий как сценарий замены, он мог бы затем использоваться следующим образом:
replace-script < yourfile | mysql
template.txt
Variable 1 value: ${var1}
Variable 2 value: ${var2}
data.sh
#!/usr/bin/env bash
declare var1="value 1"
declare var2="value 2"
parser.sh
#!/usr/bin/env bash
# args
declare file_data=$1
declare file_input=$2
declare file_output=$3
source $file_data
eval "echo \"$(< $file_input)\"" > $file_output
./ parser.sh data.sh template.txt parsed_file.txt
parsed_file.txt
Variable 1 value: value 1
Variable 2 value: value 2