从 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 扩展,即${BACKUP_ROOT@Q},但到目前为止我还没有找到在BACKUP_ROOT参数中转义反斜杠的选项。

我想知道是否有任何优雅的选择来实现这一点?请注意,我在其他几个地方需要未转义的变量,所以我更喜欢不是另外用转义反斜杠来定义它们BACKUP_ROOT_ESC="\\/var\\/backup"。那肯定不优雅 ;)

我也希望不是使用不同的限制器,因为我还有其他变量,例如,密码可能包含意外匹配搜索/替换分隔符的其他字符。因此,找到一种自动转义斜线(也可能是反斜线)的方法将是最可靠的选择。

答案1

出于风格考虑,你应该避免使用大写变量名

它不是一个类似的扩展标志Q,但您可以使用通用的${parameter//pattern/string}设置pattern为文字斜杠\/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'

相关内容