각 환경의 비밀번호를 암호화했습니다. 몇 가지 특수 문자가 있습니다. 다음은 개발 환경의 예입니다(슬래시 포함).
$$Param_INFA_USER=USR_DF
$$Param_INFA_PASS=1OFR6pSbNq/yvLtpxHbC9E9KvloTj5tRGpzr9dCMD7E=
v_prst_pwd=`grep -i "\\$\\$Param_INFA_PASS" param_file.parm` | tr -d ' '
v_lbl_pwd=`grep -i "\\$\\$Param_INFA_PASS" param_file.parm | cut -d '=' -f1`
sed -i 's/'$v_prst_pwd'/'$v_lbl_pwd'='$envspfc_pwd'/g' param_file.parm
sed -i s/$$Param_INFA_PASS=**1OFR6pSbNq/yvLtpxHbC9E9KvloTj5tRGpzr9dCMD7E=**/$$Param_INFA_PASS=ABC/g param_file.parm
비밀번호를 변경하려고 하는데 다음과 같은 문제가 발생했습니다.
sed: -e expression #1, char 74: unknown option to `s'
문자열을 변수로 바꿀 때 특수 문자를 이스케이프하는 방법(특수 문자의 위치를 알지 못한 채)
답변1
가치 Param_INFA_PASS
는 분명하다Base64. 문자, 숫자, 문자를 포함할 +
수 /
있습니다 =
.
일반 grep에서는 이러한 문자 중 어느 것도 특별하지 않습니다. egrep 또는 의 경우 grep -E
이 문자는 +
특별하므로 이스케이프해야 합니다. 사용하지 마세요 grep -i
: Base64는 대소문자를 구분합니다.
sed를 수행하려면 올바르게 수행하면 이러한 문자 중 어느 것도 특별하지 않습니다. s
명령 에서는 대신 임의의 문자를 사용할 수 있습니다 /
. 예를 들어 Base64에서 사용되지 않은 것을 선택하십시오.
sed -e "s~^PASSWORD=$old_password\$~$new_password~g"
¹개행 문자와 백슬래시는 제외됩니다 .
답변2
sed확실히/
구분 기호 로 사용됩니다 .
이러한 예 때문에 sed가 /
구분 기호로 사용된다고 가정합니다. 하지만 어떤 문자든 사용할 수 있습니다.
예를 들어, 뒤에 구분 기호가 오는 형식으로 sed 's/abc/def/'
작성할 수 있습니다 .sed 's^abc^def^
s
입력 텍스트에 문자가 사용되지 않으면 이를 활용할 수 있습니다(인쇄되지 않는 문자 선택 등).