저는 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>
매니페스트/지정된 테스트에 개행 문자가 없으면 작동하는 것으로 나타났습니다.
누구든지 수정 사항을 알고 있습니까?
답변1
"manifest/specialtests.xml" 파일의 전체 내용을 SPECTESS 변수에 넣고 sed
"buildFiles/buildrunspecialtests.template.xml" 파일을 검색하여 "<runTest" 문자열의 모든 항목을 바꾸도록 지시한 것 같습니다. ></ runTest>"에는 SPECTESS의 전체 내용이 포함되어 있습니다.
알다시피, 이는 Specifiedtests.xml에 특수 문자가 있으면 쉽게 깨질 수 있습니다. 특히 $SPECTESTS의 개행 문자는 중간에 있는 "s" 명령을 중단합니다. 오류는 sed가 명령을 계속 읽을 수 있으려면 개행 문자를 이스케이프해야 함을 의미합니다.
당신이 정말로 원하는 것은 "<deploy>"와 "</deploy>"를 Spectests.xml의 내용에 추가하는 것 같은데요? 맞아?
이 경우에는 할 수 있습니다
{ echo "<deploy>"; cat "$SPECTESTSFILE"; echo "</deploy>"; } > "$BUILDXML_TEMPLATE_FILE"
그래도 작동하지 않으면 의 개행 문자를 구체적으로 처리하기 위해 $SPECTESTS
sed에 공급하기 전에 이를 다른 것으로 바꾸고 sed가 완료된 후 다음과 같이 개행 문자로 다시 변환할 수 있습니다.
SPECTESTS="$(tr '\n' '\r' < $SPECTESTSFILE)"
sed "s|<runTest><\/runTest>|$SPECTESTS|g" $BUILDXML_TEMPLATE_FILE | tr '\r' '\n'
그러면 결과가 buildrunspecialtests.template.xml로 반환되는 대신 표준 출력에 표시됩니다. (그러나 결과를 다른 파일에 저장하고 싶을 수도 있습니다. 그렇지 않으면 향후 대체가 중단될 것입니다.)
그러나 |, &, \ 등 $SPECTESTS에 나타나는 문제가 있는 다른 문자에는 여전히 취약합니다.
다음 해결 방법을 시도해 볼 수 있습니다.sed 명령은 한 파일의 문자열을 다른 파일의 전체 내용으로 대체합니다..