sed를 사용하여 "\"가 포함된 문자열을 대체하는 방법은 무엇입니까?

sed를 사용하여 "\"가 포함된 문자열을 대체하는 방법은 무엇입니까?

이름이 파일이에요내파일.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\==

에서펄독그리고\Qq()

"단어"가 아닌 모든 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\=\=

관련 정보