その文字列の値に基づいて、文字列をコマンドの出力に置き換えます。

その文字列の値に基づいて、文字列をコマンドの出力に置き換えます。

私はsh:でスクリプトを書いています。

  • 構成ファイルの読み取り
  • {{ value_0000 }}検索間の各値について0000
    • 0000パラメーターとして渡された値を使用してコマンドを実行します。
    • {{ value_0000 }}次へ交換出力このコマンドの

メモ:

  • value_0000常に数値に変換してください。0000
  • コマンドは常に同じです。/bin/command <value>
  • 現在、設定ファイルを編集したくありません。メモリから実行できます。

例:

# this is a config file
key: {{ value_12345 }}:hello
something
another_key: return:{{ value_56789 }}/yeah

./run.sh

# this is a config file
key: returned-value:hello
something
another_key: return:another-returned-value2/yeah

設定ファイルから値を取得できますが、期待どおりに機能するにはより多くのコードが必要です。

#!/bin/sh
cat some.conf | while read line
do
   echo $line
   val="$(grep -o -P '(?<={{ value_).*(?= }})')"
   command $val
done

答え1

そしてperl

perl -pe 's(\{\{ value_(\d+) \}\})(`cmd $1`)ge' < some.conf

ここでは、シェルをバイパス$1しても空ではなく、シェル構文に特殊文字(数字のみ)が含まれないことが保証されるので安全です。perlただし、\d+(1つ以上の数値シーケンス)を別のものに変更すると危険になり(たとえば、などの値の場合foo;reboot)、次のようにより安全なアプローチを取ることができます。

perl -pe '
  s(\{\{ value_(.*?) \}\})(
    open my $fh, "-|", "cmd", $1 or die "cannot start cmd: $!";
    local $/ = undef;
    <$fh>;
  )ge' < some.conf

オプションが許可されている場合(および可能であれば)で始まる値に関連する問題を回避するために、または(オプションの終了マークとしてサポートされていると仮定)にcmd置き換える必要があります。"cmd""cmd", "--"qw(cmd --)---+

いずれにせよ、while readテキストを処理するためにシェルループを使用しないことをお勧めします

答え2

match()の3番目の引数を一致させるには、GNU awkを使用します。

$ cat tst.awk
match($0,/(.*{{ value_)([0-9]+)( }}.*)/,a) {
    cmd = "echo \"<foo_" a[2] "_bar>\""
    if ( (cmd | getline output) > 0 ) {
        $0 = a[1] output a[3]
    }
    close(cmd)
}
{ print }

$ awk -f tst.awk some.conf
# this is a config file
key: {{ value_<foo_12345_bar> }}:hello
something
another_key: return:{{ value_<foo_56789_bar> }}/yeah

そしていくつかの奇妙な:

$ cat tst.awk
match($0,/{{ value_[0-9]+ }}/) {
    cmd = "echo \"<foo_" substr($0,RSTART+9,RLENGTH-12) "_bar>\""
    if ( (cmd | getline output) > 0 ) {
        $0 = substr($0,1,RSTART+8) output substr($0,RSTART+RLENGTH-3)
    }
    close(cmd)
}
{ print }

$ awk -f tst.awk some.conf
# this is a config file
key: {{ value_<foo_12345_bar> }}:hello
something
another_key: return:{{ value_<foo_56789_bar> }}/yeah

関連情報