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
解决方案
这窃取了我对如何在 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参数扩展将匹配的模板字符串替换为变量的值,使用间接变量扩展。
推荐阅读
- nlp - 使用 OpenIE 提取给定实体的关系
- python - Python 替代全局变量
- android - Android - 使用 MIDI 文件播放 SoundFont
- multithreading - 提高 scala .par 操作的并行度
- c# - CellStyle 的 NPOI 字体不起作用,必须修复工作表
- r - 如何加快 bookdown 的生成?
- c# - 统一增加游戏对象的规模不起作用?
- c# - 以下方法或属性之间的调用不明确:'MvvmCross.Binding.BindingContext.MvxBindingContextOwnerExtensions
- python-3.x - 无法使用 sympy 获取简化坐标 - python
- xamarin.ios - “内存”类型
' 存在于 'System.Memory 4.0.1.0 和 mscorlib 2.0.5.0