1
${[a-zA-Z0-9._:]*}

${SomeText} に似た単語を grep するために上記のパターンを使用しました。「SomeText」を他の文字列、つまり ${SomeText} --> bash スクリプトの SomeString に置き換えるにはどうすればよいですか?

例: file.txt

text text text ${SomeText1} text text ${SomeText2} text text text text text text
text text text text ${SomeText3} text text text text text text ${SomeText4} text
...

私のスクリプトファイル:

SomeText1="foo"
SomeText2="bar"
..

${SomeText1} を $SomeText1 に置き換えたいのですが、これは foo に置き換えられます。同様に ${SomeText2} > $SomeText2 > bar

text text text foo text text bar text text text text text text
text text text text baz text text text text text text qux text
...
4

2 に答える 2

0

このスクリプトを試すことができます:

while IFS='=' read k v; do
   v=$(tr -d '"' <<< $v)
   sed -i.bak "s/\${$k}/$v/g" file.txt
done < script
于 2013-07-27T12:00:32.627 に答える
0

使用できますsed

echo '${SomeText}, SomeText' | sed "s/\${SomeText}/\${SomeOtherText}/g"

出力します

${SomeOtherText}, SomeText

sed で変数を使用する必要がある場合は、次のようにします。

a="SomeText"
b="SomeOtherText"

echo '${SomeText}, SomeText' | sed "s/\${$a}/\${$b}/g"

出力は上記と同じになります

編集:配列を使用してその文字列を保存することをお勧めします

 SomeText[1]="foo"
 SomeText[2]="bar"

 i=0

 while [[ $i < $MAX_i ]]
 do
   ((i++))
   sed -i "s/\${SomeText[$i]}/${SomeText[$i]}/g"
 done

あなたのアプローチが本当に必要な場合は、二重評価が必要になります

 SomeText[1]="foo"
 SomeText[2]="bar"

 i=0

 while [[ $i < $MAX_i ]]
 do
   ((i++))
   toRepl="SomeText"$i
   scriptToCall=$(eval echo "s/\\\${$toRepl}/$`eval echo ${toRepl}`/g")
   sed -i $scriptToCall file
 done

したがって、すべてのインデックス (SomeText1、SomeText2、...) を反復処理し、現在を var に保存し、toRepl呼び出すスクリプトを評価します。i=1 のscriptToCall="s/\${SomeText[1]}/foo/g"場合、二重に評価toRepl -> ${SomeText1} -> fooし、そのスクリプトを sed に渡します:)

これでクリアですか?

于 2013-07-27T10:51:50.097 に答える