이름이 파일이에요내파일.txt다음 내용으로:
사용자 이름=myusername
암호화된 비밀번호=9k3S+sS3g\=\=
사용자 이름과 비밀번호를 변경해야 할 때마다 쉘 스크립트를 실행합니다. 쉘 스크립트에서는 저장 사용자 이름과 비밀번호를 다음 두 변수에 저장합니다.
oldusername="myusername"
oldpassword="9k3S+sS3g\=\="newusername="나의 새로운 사용자 이름"
newpassword="U8djlk+h\=="
sed -i "s/$oldusername/$newusername/g" MyFile.txt
sed -i "s/$oldpassword/$newpassword/g" MyFile.txt
첫 번째 sed는 제대로 작동하고 사용자 이름을 대체하지만 두 번째 sed 명령은 작동하지 않으며 파일에서 비밀번호가 변경되지 않습니다. 변수에 "\" 문자가 있기 때문인 것 같습니다.
누군가 나를 도와주고 어떻게 해야 하는지 알려줄 수 있나요?
감사해요..
답변1
어리석은 해결 방법은 모든 백슬래시를 피하십시오.
oldpassword="$(printf "$oldpassword" | sed 's/\\/\\\\/g')"
sed -i "s/$oldpassword/$newpassword/g" MyFile.txt
답변2
$ cat MyFile.txt
Username=myusername
EncryptedPassword=9k3S+sS3g\=\=
$ oldusername="myusername"
$ oldpassword="9k3S+sS3g\=\="
$ newusername="mynewusername"
$ newpassword="U8djlk+h\=="
$ perl -pe "s/\Q$oldusername/q($newusername)/e ; s/\Q$oldpassword/q($newpassword)/e" MyFile.txt
Username=mynewusername
EncryptedPassword=U8djlk+h\==
에서펄독그리고\Q
q()
"단어"가 아닌 모든 ASCII 문자를 백슬래시로 묶어 EXPR 값을 반환합니다. (즉, /[A-Za-z_0-9]/와 일치하지 않는 모든 ASCII 문자는 로케일 설정에 관계없이 반환된 문자열에서 백슬래시 앞에옵니다.) 이것은 이중으로 \Q 이스케이프를 구현하는 내부 함수입니다. -따옴표 붙은 문자열
결과가 괜찮으면 perl -i -pe
다음과 같이 내부 편집에 사용합니다.sed
답변3
$oldpassword의 내용을 에코했습니까? $oldpassword에는 백슬래시가 없습니다.
$ oldpassword=9k3S+sS3g\=\=
$ echo $oldpassword
9k3S+sS3g==
따라서 경기는 실패하게 됩니다.
백슬래시 문자를 넣으려면 oldpassword에 할당한 값 주위에 작은따옴표를 넣어 쉘이 이 문자를 이스케이프 시퀀스로 해석하지 못하도록 하십시오. 즉, 값을 리터럴 문자열로 만드십시오.
$ oldpassword='9k3S+sS3g\=\=