使用环境变量替换sed字符串

时间:2018-09-13 00:14:35

标签: bash sed

在这种情况下,需要在环境中设置变量,并且必须用文件的值替换这些变量。

例如,我有很多变量集,其中只有FRUIT = APPLE,TIME = DAILY。文本文件的内容是

  

$$ FRUIT $$对健康有益。每个人都应该吃$$ FRUIT $$ $$ TIMES $$。

现在,我希望使用sed命令在$$$$中搜索任何字符串,并将其用作env变量以获取值并将其替换到文件中。

  

苹果对健康有益。每个人都应该每天吃苹果。

我尝试了sed -i -E "s|$$([A-Z]+)$$|${\1}|g" test.txt和其他多种组合,但没有用。

它给我错误-bash: s|$$([A-Z]+)$$|${\1}|g: bad substitution

3 个答案:

答案 0 :(得分:1)

这从我对How can I interpret variables on the fly in the shell script?的回答中窃取了-这个问题不是相当的重复。

str='The $$FRUIT$$ is good for health. Everyone should eat $$FRUIT$$ $$TIMES$$'
FRUIT=APPLE
TIMES=DAILY

while [[ $str =~ ('$$'([[:alnum:]_]+)'$$') ]]; do
    str=${str//${BASH_REMATCH[1]}/${!BASH_REMATCH[2]}}
done

echo "$str"
The APPLE is good for health. Everyone should eat APPLE DAILY

我们搜索模板字符串,捕获带有美元符号的整个字符串,还捕获其中的变量名。然后,使用外壳参数扩展,使用间接变量扩展,将匹配的模板字符串替换为变量的 value

答案 1 :(得分:1)

这是从How can I interpret variables on the fly in the shell script?的答案中窃取的-这个问题并不是那个问题的重复。

提供了变量是环境的一部分:

export FRUIT="APPLE"
export TIMES="DAILY"

您可以使用envsubst GNU工具执行变量替换:

echo 'The $$FRUIT$$ is good for health. Everyone should eat $$FRUIT$$ $$TIMES$$.' | sed -E 's/\$\$([A-Z]+)\$\$/${\1}/g' | envsubst
The APPLE is good for health. Everyone should eat APPLE DAILY.

请注意,您需要在$字符前加反斜杠,因为该字符具有sed的含义。

答案 2 :(得分:0)

这是仅使用sedgrep的方法

list=$(grep -wo "\\$\S\S*\\$" test2 | sort -u | tr '$' '\n');
for thing in ${list[@]}; do sed -i 's/\$\$'$thing'\$\$/'$"${!thing}"'/g' test2; done

下面是一些解释(不言而喻)

user$ echo $TIMES
DAILY
user$ echo $FRUIT
APPLE
user$ cat test2 
The $$FRUIT$$ is good for health. Everyone should eat $$FRUIT$$ $$TIMES$$.
user$ list=$(grep -wo "\\$\S\S*\\$" test2 | sort -u | tr '$' '\n'); 
user$ echo $list
FRUIT TIMES
user$ for thing in ${list[@]}; do sed -i 's/\$\$'$thing'\$\$/'$"${!thing}"'/g' test2; done
user$ cat test2 
The APPLE is good for health. Everyone should eat APPLE DAILY.