從 bash 變數中轉義字符

從 bash 變數中轉義字符

我正在嘗試使用 bash 變數搜尋並替換配置模板中的字串。

Bash 變數

BACKUP_KEY="ABCDEFG"
BACKUP_ROOT="/var/backup"

配置模板(template.conf):

GPG_KEY='BACKUP_KEY_ID'
GPG_OPTS="--pinentry-mode loopback"
TARGET='file://BACKUP_ROOT/partA'
SOURCE='/partA'
MAX_AGE=3M

預期結果:

GPG_KEY='ABCDEFG'
GPG_OPTS="--pinentry-mode loopback"
TARGET='file:///var/backup/partA'
SOURCE='/partA'
MAX_AGE=3M

對於第一個參數來說,使用 很容易sed,但是第二個參數中的反斜線需要轉義為sed

# What I try
sed "s/BACKUP_KEY/${BACKUP_KEY}/g; s/BACKUP_ROOT/${BACKUP_ROOT}/g" template.conf > ~/.duply/partA/conf
# What this becomes
sed "s/BACKUP_KEY/ABCDEFG/g; s/BACKUP_ROOT//var/backup/g" template.conf > ~/.duply/partA/conf

我找到了允許添加單引號的 bash 擴展,即 ie ${BACKUP_ROOT@Q},但到目前為止我還沒有找到一個選項來轉義參數中的反斜線BACKUP_ROOT

我想知道是否有任何優雅的選擇來實現這一目標?請注意,我需要在其他幾個地方使用未轉義的變量,所以我更喜歡不是使用轉義反斜線另外定義它們BACKUP_ROOT_ESC="\\/var\\/backup"。那絕對不優雅;)

我也更願意不是使用不同的限制器,因為我還有其他變量,例如,密碼可能包含意外匹配搜尋/替換分隔符的其他字元。因此,找到自動轉義斜線(也許還有反斜線)的方法將是最可靠的選擇。

答案1

作為風格問題,您應該避免變數名稱全部大寫

它不是像 那樣的擴展標誌Q,但您可以使用通用${parameter//pattern/string}withpattern設置為文字斜杠\/string設置為文字反斜杠 - 文字斜杠\\\/

$ echo "${BACKUP_ROOT}"
/var/backup

$ echo "${BACKUP_ROOT//\//\\\/}"
\/var\/backup

$ echo "TARGET='file://BACKUP_ROOT/partA'" | sed "s/BACKUP_ROOT/${BACKUP_ROOT//\//\\\/}/"
TARGET='file:///var/backup/partA'

相關內容