![从 bash 变量中转义字符](https://linux22.com/image/1072644/%E4%BB%8E%20bash%20%E5%8F%98%E9%87%8F%E4%B8%AD%E8%BD%AC%E4%B9%89%E5%AD%97%E7%AC%A6.png)
我正在尝试使用 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'