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

我已经使用上述模式来搜索类似于 ${SomeText} 的单词。如何在我的 bash 脚本中将 'SomeText' 替换为其他字符串,即 ${SomeText} --> 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

您可以使用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,...),将当前保存到 vartoRepl中,评估您要调用的脚本,对于 i=1 这将scriptToCall="s/\${SomeText[1]}/foo/g"导致您双重评估toRepl -> ${SomeText1} -> foo并将该脚本传递给 sed :)

现在清楚了吗?

于 2013-07-27T10:51:50.097 回答
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 回答