gpt4 book ai didi

sed - 使用 Sed 扩展文件内的环境变量

转载 作者:行者123 更新时间:2023-12-03 18:28:00 25 4
gpt4 key购买 nike

我想使用 Sed 来扩展文件中的变量。

假设我导出了一个变量 VARIABLE=something,并且有一个包含以下内容的“测试”文件:

I'd like to expand this: "${VARIABLE}"

我一直在尝试如下命令,但无济于事:
cat test | sed -e "s/\(\${[A-Z]*}\)/`eval "echo '\1'"`/" > outputfile

结果是变量仍未扩展的“输出文件”:
I'd like to expand this: "${VARIABLE}"

仍在运行 eval "echo '${VARIABLE}'在 bash 控制台中,会回显值“something”。此外,我进行了测试,该模式确实匹配。

所需的输出将是
I'd like to expand this: "something"

任何人都可以对此有所了解吗?

最佳答案

考虑您的试用版:

cat test | sed -e "s/\(\${[A-Z]*}\)/`eval "echo '\1'"`/" > outputfile

这不起作用的原因是因为它需要 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

如果你想任意映射变量,那么你要么需要处理整个环境(而不是变量名的固定列表,使用来自 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

但是,更好的解决方案使用这样一个事实,即您已经在 env 的输出中获得了值。 ,所以我们可以写:
env |
sed 's/[\%]/\\&/g;s/\([^=]*\)=\(.*\)/s%${\1}%\2%/' > sed.script
cat test | sed -f sed.script > outputfile

这完全是安全的,因为 shell 从不评估任何不应该被评估的东西——你必须非常小心变量值中的 shell 元字符。如果来自 env 的某些输出,此版本可能会遇到任何问题是畸形的,我想。

当心-写作 sed带有 sed 的脚本是一种深奥的职业,但却说明了好工具的力量。

所有这些例子都是不清理临时文件的疏忽。

关于sed - 使用 Sed 扩展文件内的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1609423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com