
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'