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

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

저는 SH와 개발을 처음 접했고 한 번에 하나씩 오류가 발생하는 코드를 헤쳐나가고 있습니다.

지금은 원인을 알 수 없어 이 오류가 발생했습니다. 어떤 도움이라도 좋을 것입니다!

GitHub Actions에서 sh 스크립트를 실행 중인데 다음 오류가 발생합니다.

sed: -e expression #1, char 73: unterminated `s' command

내 코드는 다음과 같습니다.

SPECTESTSFILE='manifest/specifictests.xml'
  cat $SPECTESTSFILE

  BUILDXML_TEMPLATE_FILE='buildFiles/buildrunspecifictests.template.xml'
  SPECTESTS="$(cat $SPECTESTSFILE)"
  echo "Specified Tests: "
  echo $SPECTESTS
  sed -i "s|<runTest><\/runTest>|$SPECTESTS|g" $BUILDXML_TEMPLATE_FILE

내 매니페스트/특정 테스트.xml 파일에는 새 줄이 포함된 RunTest 목록이 있습니다.

<runTest>...</runTest>
<runTest>....</runTest>

이 목록을 buildFiles/buildrunspecialtests.template.xml 파일에 삽입하고 싶습니다.

<deploy>
    <runTest></runTest>
</deploy>

결국 나는 파일이 다음과 같기를 원합니다.

<deploy>
   <runTest>...</runTest>
   <runTest>....</runTest>
</deploy>

내가 찾은 것은 매니페스트/특정 테스트.xml 파일에 개행이 없으면 작동하지만 사용자가 파일을 사용하거나 결국 다른 곳에서 이 파일 생성을 자동화하는 데 많은 자유를 허용하지 않는다는 것입니다.

누구든지 수정 사항을 알고 있습니까?

답변1

sed'manifest/특이적tests.xml' 파일의 전체 내용을 SPECTESTS 변수에 집어넣고 'buildFiles/buildrunspecialtests.template.xml' 파일을 검색하여 모든 항목을 바꾸도록 지시한 것 같습니다. 문자열 "<runTest></runTest>"를 SPECTESTS의 전체 내용으로 바꿉니다.

이미 알고 있듯이 특정tests.xml에 특수 문자가 있으면 깨지기 쉽습니다. 특히 $SPECTESTS의 개행 문자는 오류에서 알 수 있듯이 "s" 명령의 중간을 방해합니다. sed가 명령을 계속 읽으려면 개행 문자를 이스케이프해야 합니다.

실제로 원하는 것은 특정tests.xml의 내용에 "<deploy>"를 추가하고 "</deploy>"를 추가하는 것 뿐인 것 같습니까? 그렇죠?

어떤 경우에는 그냥 할 수 있습니다

{ echo "<deploy>"; cat "$SPECTESTSFILE"; echo "</deploy>"; } > "$BUILDXML_TEMPLATE_FILE"

그래도 작동하지 않으면 에서 개행을 구체적으로 해결하려면 $SPECTESTSsed에 공급하기 전에 다른 것으로 바꾸고 sed가 완료된 후 다음과 같이 다시 개행으로 바꿀 수 있습니다.

SPECTESTS="$(tr '\n' '\r' < $SPECTESTSFILE)"
sed "s|<runTest><\/runTest>|$SPECTESTS|g" $BUILDXML_TEMPLATE_FILE | tr '\r' '\n'

이렇게 하면 결과가 다시 buildrunspecialtests.template.xml이 아닌 표준 출력에 표시됩니다. (그러나 결과를 다른 파일로 원할 수도 있습니다. 그렇지 않으면 향후 대체가 중단될 것입니다.)

하지만 $SPECTESTS에 |, &, \와 같은 다른 문제가 있는 문자가 나타날 가능성은 여전히 ​​있습니다.

다음에서 솔루션을 시도해 볼 수 있습니다.한 파일의 문자열을 다른 파일의 전체 내용으로 바꾸는 sed 명령.

관련 정보