&&가 포함된 문자열을 sed로 교체하세요.

&&가 포함된 문자열을 sed로 교체하세요.

기술 승인 테스트를 자동화하기 위한 몇 가지 스크립트를 작성했습니다. 비밀번호를 일반 텍스트로 쓰는 것이 허용되지 않기 때문에 제가 사용하는 스크립트는 여러 변수와 연결되어 있으며 그 중 하나가 비밀번호입니다. 실행하기 전에 password.key=mycryptedpassword파일에서 해당 행을 가져오고 비밀번호를 해독하여 스크립트에서 사용합니다. 그런 다음 키를 스크립트에서 사용하는 임시 파일의 비밀번호로 바꾸려고 했습니다. 여기서 문제가 발생합니다. 다음 코드를 사용합니다.

sed -i -e 's/$key/$decryptedPassword/g' json.tmp

일반적으로 잘 작동하지만 내가 만난 비밀번호 중 하나는 다음과 같습니다.cl&&TiT8

sed와 linux(저는 기본적으로 redhat에서 ksh 쉘을 사용하고 있습니다)에게 이러한 &&. 혹시 이렇게 이상한 비밀번호를 사용하는 분들을 만날까봐 걱정되는데 어떻게 대처하면 될까요?

개요: 이것이 바로 제가 한 일입니다: sed -i -e 's/$key/$decryptedPassword/g' json.tmp. 당시에는 $decryptedPassword = cl&&TiT8이것이 작동하지 않았습니다.

답변1

sed에서 이 작업을 수행 하면 의 s/regexp/replacement/문자 &replacement특별한 의미를 가지며 해당 문자가 나타나면 일치하는 string 으로 확장됩니다 regexp. 따라서 다음을 사용하여 이스케이프해야 합니다 \.

sed -i -e 's/$key/cl\&\&TiT8/g' json.tmp

/또한 and '\and 도 이스케이프해야 합니다 $key.$decryptedPassword

sed 명령을 교체하는 방법은 무엇입니까 $key?$decryptedPassword

답변2

  • '$key'나는 판단하지 않을 $key것이다 "$key".

노력하다

d2=$(echo "$decryptedPassword" | sed -e 's.&.\\\&.g' )
sed -i -e "s/$key/$d2/g" json.tmp
  • 제공되지 도 포함되지 $key도 않음$decryptedPassword/
  • 교체 모드에서 사용해야 하므로 먼저 any - 를 이것으로 교체 \&해야 합니다. 또한 및 &를 모두 이스케이프해야 한다는 점을 고려 하여 "\&\\\&내부에"세드

  • 둘 다 's.&.\\&.g' 입니다 's.&.\\\&.g'.

  • with 's.&.\\&.g', \이스케이프 자체, while &대체 &(sed 대체에 의해)
  • with 's.&.\\\&.g', \자체적으로 이스케이프하고 '\&'를 대체합니다(sed 대체 없음).

관련 정보