Как заменить $ {} заполнители в текстовом файле?

137
задан Yves M. 3 November 2015 в 20:06
поделиться

5 ответов

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 вызов.

165
ответ дан 23 November 2019 в 23:31
поделиться

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

$ 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 и вуаля, надо надеяться, Вы не уничтожите свою базу данных :-).

1
ответ дан 23 November 2019 в 23:31
поделиться

Используйте /bin/sh. Создайте маленький сценарий оболочки, который устанавливает переменные, и затем проанализируйте шаблон с помощью самой оболочки. Как так (редактируют для обработки новых строк правильно):

Файл template.txt:

the number is ${i}
the word is ${word}

Файл script.sh:

#!/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
44
ответ дан 23 November 2019 в 23:31
поделиться

Если бы Вы открыты для использования 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
5
ответ дан 23 November 2019 в 23:31
поделиться

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
12
ответ дан 23 November 2019 в 23:31
поделиться
Другие вопросы по тегам:

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