私は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 --)
--
-
+
答え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