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

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

私は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テキストを処理するためにシェルループを使用しないことをお勧めします

おすすめ記事