누군가 여기서 무슨 일이 일어나고 있는지 말해 줄 수 있습니까?
sed -i "s|##CONNECTION_DETAILS##|${CONNECTION_DETAILS}|g" dep.yaml.
CONNECTION_DETAILS의 값은 인코딩된 형식입니다.
CSAgewogICAgICAgICJjb25uZWN0aW9uX25hbWVfMSI6ICJPRlNBQV9BTkFMWVRJQ1NfUFVCIiwKICAgICAgICAiZGF0YWJhc2VfbmFtZV8xIjogIk9GU0FBX0FOQUxZVElDU19QVUIiLAogICAgICAgICJiaV9TZXJ2aWNlc18xIjpbImR2IiwicnBkIiwiYmlwdWJsaXNoZXIiXQogICAgICB9Cg==
을 위한:
{
"connection_name_1": "OFSAA_ANALYTICS_PUB",
"database_name_1": "OFSAA_ANALYTICS_PUB",
"bi_Services_1":["dv","rpd","bipublisher"]
}
답변1
변수 CONNECTION_DETAILS
에 LF( \n
) 문자가 포함되어 있습니다.
따라서 sed
종료되지 않은 명령을 이해하지 마십시오 s
. 두 번째 이전의 LF "
.
그리고:
> CONNECTION_DETAILS='CSAgewogICAgICAgICJjb25uZWN0aW9uX2
5hbWVfMSI6ICJPRlNBQV9BTkFMWVRJQ1NfUFVCIiwKICAgICAgICAi
ZGF0YWJhc2VfbmFtZV8xIjogIk9GU0FBX0FOQUxZVElDU19QVUIiLA
ogICAgICAgICJiaV9TZXJ2aWNlc18xIjpbImR2IiwicnBkIiwiYmlw
dWJsaXNoZXIiXQogICAgICB9Cg=='
두 가지 솔루션:
- LF 문자 제거
> lf=$'\n'
> echo "xxxxx ##CONNECTION_DETAILS## xxxxx" | sed -e "s|##CONNECTION_DETAILS##|${CONNECTION_DETAILS//$lf}|g"
xxxxx CSAgewogICAgICAgICJjb25uZWN0aW9uX25hbWVfMSI6ICJPRlNBQV9BTkFMWVRJQ1NfUFVCIiwKICAgICAgICAiZGF0YWJhc2VfbmFtZV8xIjogIk9GU0FBX0FOQUxZVElDU19QVUIiLAogICAgICAgICJiaV9TZXJ2aWNlc18xIjpbImR2IiwicnBkIiwiYmlwdWJsaXNoZXIiXQogICAgICB9Cg== xxxxx
- LF 유지(피하세요)
> lf=$'\n'
> echo "xxxxx ##CONNECTION_DETAILS## xxxxx" | sed -e "s|##CONNECTION_DETAILS##|${CONNECTION_DETAILS//$lf/\\$lf}|g"
xxxxx CSAgewogICAgICAgICJjb25uZWN0aW9uX2
5hbWVfMSI6ICJPRlNBQV9BTkFMWVRJQ1NfUFVCIiwKICAgICAgICAi
ZGF0YWJhc2VfbmFtZV8xIjogIk9GU0FBX0FOQUxZVElDU19QVUIiLA
ogICAgICAgICJiaV9TZXJ2aWNlc18xIjpbImR2IiwicnBkIiwiYmlw
dWJsaXNoZXIiXQogICAgICB9Cg== xxxxx
고쳐 쓰다
텍스트 주위에 큰따옴표를 추가하려면 다음을 수행하십시오.
> lf=$'\n'
> echo "xxxxx ##CONNECTION_DETAILS## xxxxx" | sed -e "s|##CONNECTION_DETAILS##|\"${CONNECTION_DETAILS//$lf/\\$lf}\"|g"
xxxxx "CSAgewogICAgICAgICJjb25uZWN0aW9uX2
5hbWVfMSI6ICJPRlNBQV9BTkFMWVRJQ1NfUFVCIiwKICAgICAgICAi
ZGF0YWJhc2VfbmFtZV8xIjogIk9GU0FBX0FOQUxZVElDU19QVUIiLA
ogICAgICAgICJiaV9TZXJ2aWNlc18xIjpbImR2IiwicnBkIiwiYmlw
dWJsaXNoZXIiXQogICAgICB9Cg==" xxxxx
답변2
YAML을 사용하여 수행 sed
하고 있으며 매우 유연하기는 하지만 아마도 잘못된 도구일 수 있습니다.
다음과 같은 더 적합한 도구를 사용하는 것이 좋습니다.jq
JSON의 경우(만) 또는yq
JSON/YAML의 경우.
jq
JSON을 조작하는 데 이미 성숙해 있으므로 yq
YAML로 작업해야 할 때에도 신뢰할 수 있는 대응물입니다.
많이 표시하지 않았으므로 이는 상당히 일반적인 예( .config.connection_details
업데이트할 값으로 사용됨)이지만 간단할 수도 있습니다.
$ yq --inplace '.config.connection_details = {"connection_name_1": "OFSAA_ANALYTICS_PUB", "database_name_1": "OFSAA_ANALYTICS_PUB", "bi_Services_1":["dv","rpd","bipublisher"]}' dep.yaml
sed
이것이 작동하는 동안, 표정을 엉망으로 만들 수 있는 캐릭터와 비슷하게 보이고 동일한 문제를 겪습니다.
더 나은 옵션으로 값을 별도의 문서로 제공하고 첫 번째 문서에 삽입할 수 있습니다.
$ printf "%s" "${CONNECTION_DETAILS}" | yq eval-all --inplace 'select(fileIndex == 0).config.connection_details = select(fileIndex == 1)' dep.yaml -
JSON의 상위 집합인 YAML을 사용하고 있으므로 yq
JSON 또는 YAML을 제공하면 계속 로드됩니다.
편집: s가 여러 개 있는 것 같습니다 yq
. 이 답변에서는 Mike Farah를 사용하고 있습니다.Python 기반작성자: Andrey Kyslyuk, 하지만 구문이 다른 것 같습니다.
답변3
${CONNECTION_DETAILS}
모든 개행 문자를 제거 sed
하여 명령을 바꾸는 것이 좋습니다 .${CONNECTION_DETAILS//$'\n'}