라는 파일이 있습니다마이파일.txt다음 콘텐츠가 포함되어 있습니다:
사용자 이름=내 사용자 이름
암호화된 비밀번호=9k3S+sS3g\=\=
사용자 이름과 비밀번호를 변경해야 할 때마다 쉘 스크립트를 실행합니다. 쉘 스크립트에서는 저장된 사용자 이름과 비밀번호를 다음 두 변수에 저장합니다.
이전 사용자 이름 = "내 사용자 이름"
이전 비밀번호 = "9k3S+sS3g\=\="newusername="내 새 사용자 이름"
새 비밀번호="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\=\=