${[a-zA-Z0-9._:]*}
我使用上述模式来搜索类似于$ {SomeText}的单词。如何将'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>杆
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
...
答案 0 :(得分: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:)
现在是否清楚?
答案 1 :(得分:0)
您可以尝试以下脚本:
while IFS='=' read k v; do
v=$(tr -d '"' <<< $v)
sed -i.bak "s/\${$k}/$v/g" file.txt
done < script