1

ファイル template.txt があり、その内容は次のとおりです。

param1=${1}
param2=${2}
param3=${3}

${1},{2},${3}...${n} 文字列値を scriptParams 変数の要素に置き換えたいと考えています。

以下のコードは、最初の行のみを置き換えます。

scrpitParams="test1,test2,test3"

cat template.txt | for param in ${scriptParams} ; do i=$((++i)) ; sed -e "s/\${$i}/$param/" ; done

結果:

param1=test1
param2=${2}
param3=${3}

期待される:

param1=test1
param2=test2
param3=test3

注: 置換されたファイルを保存したくありません。置換された値を使用したいです。

4

3 に答える 3

1

デバッグを学ぶ:

cat template.txt | for param in ${scriptParams} ; do i=$((++i)) ; echo $i - $param; done

1 - test1,test2,test3

おっとっと..

scriptParams="test1 test2 test3"

cat template.txt | for param in ${scriptParams} ; do i=$((++i)) ; echo $i - $param; done

1 - test1
2 - test2
3 - test3

わかりました、良く見えます...

cat template.txt | for param in ${scriptParams} ; do i=$((++i)) ; sed -e "s/\${$i}/$param/" ; done
param1=test1
param2=${2}
param3=${3}

おっと...それで、何が問題なのですか? さて、最初のsedコマンドはすべての入力を「食べます」。sedあるコマンドが次のコマンドにフィードするパイプラインを構築していません... 3 つsedの が同じ入力を読み取ろうとしています。明らかに、最初のものは入力全体を処理しました。

では、別のアプローチを取りましょう。単一のsedコマンドの引数を作成しましょう (注: は、コマンド ライン スイッチとして解釈しないよう""に強制するためのものです)。echo-e

sedargs=$(for param in ${scriptParams} ; do i=$((++i)); echo "" -e "s/\${$i}/$param/"; done)
cat template.txt | sed $sedargs

param1=test1
param2=test2
param3=test3

それでおしまい。これは完全ではないことに注意してください。置換テキストが複雑な場合 (例: スペースが含まれている場合)、あらゆる種類の問題が発生する可能性があります。

これをより良い方法で行う方法を考えさせてください... (まあ、頭に浮かぶ明らかな解決策は、このタスクにシェルスクリプトを使用しないことです...)

更新: 適切なパイプラインを構築したい場合は、いくつかの解決策があります: bash でパイプ ループを作成する方法

于 2013-09-06T17:47:01.387 に答える