Text-Processing

用另一個變數的值替換一個變數

  • October 17, 2022

例如,我有一個input.txt以這句話命名的文本文件:

This is my base64 string: ${BASE64}

我有這個變數:

myvar="SGVsbG8gV29ybGQuIERvIHlvdSBsaWtlIG15IGJhc2U2NCBzdHJpbmc/IFRoYXQgaXMgdmVyeSBuaWNlIQ=="

預期輸出:

This is my base64 string: SGVsbG8gV29ybGQuIERvIHlvdSBsaWtlIG15IGJhc2U2NCBzdHJpbmc/IFRoYXQgaXMgdmVyeSBuaWNlIQ==

我認為自己這個命令應該可以完成工作,但它給出了一個錯誤。

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

我嘗試了很多選項並在網際網路上搜尋了幾個小時,但我無法準確地弄清楚。我認為這與\

起初我想知道我做錯了什麼?其次,我想知道如何正確地做。我也想要一個正確的 awk 範例。

主要問題是您所說的:我認為它與 / 有關

當您使用 with/作為分隔符時,您必須小心使用的字元串。

所以你應該在你的sed命令中使用另一個分隔符:

sed -i -e "s@\${BASE64}@${myvar}@g" text.txt 

使用 awk

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

另一種替換變數的方法是使用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

引用自:https://unix.stackexchange.com/questions/721227