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'

관련 정보