
我正在嘗試使用 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'