首页 > 解决方案 > 使用环境变量替换 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

标签: bashsed

解决方案


这窃取了我对如何在 shell 脚本中动态解释变量的回答?- 这个问题与那个问题并不完全重复。

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

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


推荐阅读