sed를 사용하여 변수 값을 동일한 이름의 변수로 바꾸는 방법은 무엇입니까?

sed를 사용하여 변수 값을 동일한 이름의 변수로 바꾸는 방법은 무엇입니까?

서버 구성 파일을 최신 형식으로 업데이트하는 스크립트를 작성하려고 합니다. 이 스크립트의 목적은 기존(정의된) 변수를 최신 구성(임시 파일)에 복사한 다음 이전 구성 파일을 새로 생성된 구성 파일로 복사/덮어쓰는 것입니다.

내 이해에 따르면큰따옴표에서 변수를 확장합니다 sed. 패턴에 하나의 변수만 사용되는 경우에는 제대로 작동하는 것 같습니다.

sed -i "s|random|$PASSWORD|g" /tmp/latest_config

위 예에서는 임시 구성 파일이 성공적으로 수정되었으며 의 모든 인스턴스가 random의 값으로 대체되었습니다 $PASSWORD. 그러나 그 반대는 사실이 아닙니다.

sed -i "s|$PASSWORD|random|g" /tmp/latest_config

위의 예에서는 아무 일도 일어나지 않고 sed 오류도 발생하지 않습니다. 임시 구성 파일의 값이 $PASSWORD수정되지 않았습니다...

참고: $PASSWORD첫 번째 예에서는 이 스크립트 상단의 "이전" 구성 파일이 제공되지만 두 번째 예의 목표는 변수 값을 바꾸는 것입니다...


SE 네트워크에서 수십 개의 유사한 "변수" 질문을 보았지만 많은 답변이 잘못되었거나(예: 작은따옴표 사용 등) 나에게 적합하지 않습니다. 작은 따옴표와 큰 따옴표, 괄호(실제로 검색되는 변수와 환경 변수를 구별하기 위해) 등 다양한 형식을 시도했지만 sed지금까지 아무 것도 작동하지 않았습니다. 예를 들면 다음과 같습니다.

sed -i "s|$PASSWORD|$PASSWORD|g" /tmp/latest_config
sed -i "s|$PASSWORD|${PASSWORD}|g" /tmp/latest_config
sed -i "s|\$PASSWORD|${PASSWORD}|g" /tmp/latest_config
sed -i 's|$PASSWORD|"${PASSWORD}"|g' /tmp/latest_config
sed -i 's|\$PASSWORD|"${PASSWORD}"|g' /tmp/latest_config

유일한 효과적인 해결책은해커 솔루션:

sed -i "s|\(^PASSWORD=\).*|PASSWORD=\"$PASSWORD\"|g" /tmp/latest-config

왜? 기존 변수를 먼저 내보내야 합니까, 아니면 이것이 최선입니까? ...

관련 정보