jmi*_*sao 4 sed environment-variables
我想使用Sed来扩展文件中的变量.
假设我导出了一个变量VARIABLE = something,并且有一个带有以下内容的"test"文件:
I'd like to expand this: "${VARIABLE}"
Run Code Online (Sandbox Code Playgroud)
我一直在尝试以下命令,但无济于事:
cat test | sed -e "s/\(\${[A-Z]*}\)/`eval "echo '\1'"`/" > outputfile
Run Code Online (Sandbox Code Playgroud)
结果是"outputfile",变量仍未展开:
I'd like to expand this: "${VARIABLE}"
Run Code Online (Sandbox Code Playgroud)
尽管如此,eval "echo '${VARIABLE}'在bash控制台中运行会导致回显值"某事".此外,我测试了这个模式是真正匹配的.
期望的输出将是
I'd like to expand this: "something"
Run Code Online (Sandbox Code Playgroud)
任何人都可以对此有所了解吗?
Jon*_*ler 11
考虑您的试用版:
cat test | sed -e "s/\(\${[A-Z]*}\)/`eval "echo '\1'"`/" > outputfile
Run Code Online (Sandbox Code Playgroud)
这不起作用的原因是因为它需要shell的预见性.在sed匹配任何模式之前生成sed脚本,因此shell无法为您完成该任务.
我过去曾做过几次这样的事情.通常,我有一个已知变量及其值的列表,我已从该列表中完成替换:
for var in PATH VARIABLE USERNAME
do
echo 's%${'"$var"'}%'$(eval echo "\$$var")'%g'
done > sed.script
cat test | sed -f sed.script > outputfile
Run Code Online (Sandbox Code Playgroud)
如果你想任意映射变量,那么你需要处理整个环境(而不是固定的变量名列表,使用输出env,适当编辑),或者使用Perl或Python.
请注意,如果环境变量的值在您的版本中包含斜杠,则使用斜杠作为s ///表示法中的字段分隔符会遇到问题.我使用'%',因为相对较少的环境变量使用它 - 但是在某些机器上发现了一些包含'%'字符的内容,因此完整的解决方案比较棘手.您还需要担心值中的反斜杠.您可能必须使用类似' $(eval echo "\$$var" | sed 's/[\%]/\\&/g')'来逃避环境变量值中的反斜杠和百分号.最后的皱纹:某些版本的sed(或者有)脚本大小的容量有限 - 旧版本的HP-UX有大约100的限制.我不确定这是否仍然是一个问题,但它最近是5年前.
对原始脚本的简单修改如下:
env |
sed 's/=.*//' |
while read var
do
echo 's%${'"$var"'}%'$(eval echo "\$$var" | sed 's/[\%]/\\&/g')'%g'
done > sed.script
cat test | sed -f sed.script > outputfile
Run Code Online (Sandbox Code Playgroud)
但是,更好的解决方案使用的事实是您已经在输出中包含了值env,因此我们可以编写:
env |
sed 's/[\%]/\\&/g;s/\([^=]*\)=\(.*\)/s%${\1}%\2%/' > sed.script
cat test | sed -f sed.script > outputfile
Run Code Online (Sandbox Code Playgroud)
这是完全安全的,因为shell永远不会评估任何不应该评估的东西 - 你必须小心使用变量值中的shell元字符.env我认为,如果某些输出格式不正确,这个版本只会遇到麻烦.
注意 - 编写sed脚本sed是一种深奥的职业,但它可以说明好工具的强大功能.
所有这些例子都是在不清理临时文件时的疏忽.
也许你可以不使用sed来解决问题:
$ echo $VARIABLE
something
$ cat test
I'd like to expand this: ${VARIABLE}
$ eval "echo \"`cat test`\"" > outputfile
$ cat outputfile
I'd like to expand this: something
Run Code Online (Sandbox Code Playgroud)
让shell变量插值完成工作.