如何替换与正则表达式模式匹配的另一个字符串中的文本

时间:2013-07-27 09:03:09

标签: bash shell unix

${[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
...

2 个答案:

答案 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