将一个变量替换为另一个变量的值

xor*_*eed 3 sed awk text-processing

例如,我有一个文本文件,input.txt其中包含这句话:

This is my base64 string: ${BASE64}
Run Code Online (Sandbox Code Playgroud)

我有这个变量:

myvar="SGVsbG8gV29ybGQuIERvIHlvdSBsaWtlIG15IGJhc2U2NCBzdHJpbmc/IFRoYXQgaXMgdmVyeSBuaWNlIQ=="
Run Code Online (Sandbox Code Playgroud)

预期输出:

This is my base64 string: SGVsbG8gV29ybGQuIERvIHlvdSBsaWtlIG15IGJhc2U2NCBzdHJpbmc/IFRoYXQgaXMgdmVyeSBuaWNlIQ==
Run Code Online (Sandbox Code Playgroud)

我认为这个命令应该可以完成工作,但它给出了一个错误。

$ sed -i -e "s/\${BASE64}/${myvar}/g" text.txt
sed: -e expression #1, char 70: unknown option to `s'
Run Code Online (Sandbox Code Playgroud)

我尝试了很多选择,并在互联网上搜索了几个小时,但我无法准确地弄清楚。我认为这与\

首先我想知道我做错了什么?其次我想知道如何正确地做到这一点。我也喜欢一个正确的 awk 示例。

Edg*_*lon 7

主要问题是你所说的:我认为这与 / 有关
当您使用 with/作为分隔符时,您必须小心使用的字符串。

因此,您应该在命令中使用另一个分隔符sed

sed -i -e "s@\${BASE64}@${myvar}@g" text.txt 
Run Code Online (Sandbox Code Playgroud)

使用 awk

myvar="SGVsbG8gV29ybGQuIERvIHlvdSBsaWtlIG15IGJhc2U2NCBzdHJpbmc/IFRoYXQgaXMgdmVyeSBuaWNlIQ=="
awk -i inplace -v var='\\$\\{BASE64\\}' -v base="$myvar" '{sub(var,base);}1'
Run Code Online (Sandbox Code Playgroud)

替换变量的另一种方法是使用envsubst. 如果您的文件包含,${BASE64}您可以创建一个具有相同名称的变量并在文件中替换它。但是在运行之前您必须导出该变量(仅一次envsubst) :

BASE64="SGVsbG8gV29ybGQuIERvIHlvdSBsaWtlIG15IGJhc2U2NCBzdHJpbmc/IFRoYXQgaXMgdmVyeSBuaWNlIQ=="
export BASE64
#Not recommended: 
envsubst < text.txt | tee text.txt
#Or
envsubst < text.txt >  newtext.txt
mv newtext.txt text.txt
Run Code Online (Sandbox Code Playgroud)

  • 我不会为此使用 sed 或 awk 脚本,因为考虑到 `myvar` 的各种不同内容,它们都会失败,例如 `\1`、`\t`、`\n`、`&amp;`、`@ ` 等 (2认同)