sed: -e 표현식 #1, 문자 101: 종료되지 않은 's' 명령

sed: -e 표현식 #1, 문자 101: 종료되지 않은 's' 명령

누군가 여기서 무슨 일이 일어나고 있는지 말해 줄 수 있습니까?

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=='

두 가지 솔루션:

  1. LF 문자 제거
> lf=$'\n'
> echo "xxxxx ##CONNECTION_DETAILS## xxxxx" | sed -e "s|##CONNECTION_DETAILS##|${CONNECTION_DETAILS//$lf}|g"
xxxxx CSAgewogICAgICAgICJjb25uZWN0aW9uX25hbWVfMSI6ICJPRlNBQV9BTkFMWVRJQ1NfUFVCIiwKICAgICAgICAiZGF0YWJhc2VfbmFtZV8xIjogIk9GU0FBX0FOQUxZVElDU19QVUIiLAogICAgICAgICJiaV9TZXJ2aWNlc18xIjpbImR2IiwicnBkIiwiYmlwdWJsaXNoZXIiXQogICAgICB9Cg== xxxxx
  1. 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하고 있으며 매우 유연하기는 하지만 아마도 잘못된 도구일 수 있습니다.

다음과 같은 더 적합한 도구를 사용하는 것이 좋습니다.jqJSON의 경우(만) 또는yqJSON/YAML의 경우.

jqJSON을 조작하는 데 이미 성숙해 있으므로 yqYAML로 작업해야 할 때에도 신뢰할 수 있는 대응물입니다.

많이 표시하지 않았으므로 이는 상당히 일반적인 예( .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을 사용하고 있으므로 yqJSON 또는 YAML을 제공하면 계속 로드됩니다.

편집: s가 여러 개 있는 것 같습니다 yq. 이 답변에서는 Mike Farah를 사용하고 있습니다.Python 기반작성자: Andrey Kyslyuk, 하지만 구문이 다른 것 같습니다.

답변3

${CONNECTION_DETAILS}모든 개행 문자를 제거 sed하여 명령을 바꾸는 것이 좋습니다 .${CONNECTION_DETAILS//$'\n'}

관련 정보