Sou muito novo em SH e desenvolvimento e estou errando no código, um erro de cada vez.
Me deparei com esse erro agora que não consigo descobrir. Qualquer ajuda seria ótimo!
Estou executando um script sh no GitHub Actions e recebo este erro:
sed: -e expression #1, char 73: unterminated `s' command
Aqui está meu código:
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
No meu arquivo manifest/specifictests.xml, tenho uma lista de RunTests com novas linhas
<runTest>...</runTest>
<runTest>....</runTest>
e quero inserir esta lista no arquivo buildFiles/buildrunspecifictests.template.xml
<deploy>
<runTest></runTest>
</deploy>
Eventualmente, quero que o arquivo fique assim:
<deploy>
<runTest>...</runTest>
<runTest>....</runTest>
</deploy>
O que descobri é que, se não houver novas linhas no arquivo manifest/specifictests.xml, ele funciona, mas não me dá muita liberdade para o usuário usá-lo ou, eventualmente, automatizar a criação desse arquivo em outro lugar.
Alguém sabe uma solução?
Responder1
Parece que você absorveu todo o conteúdo do arquivo 'manifest/specifictests.xml' na variável SPECTESTS e está instruindo sed
a pesquisar no arquivo 'buildFiles/buildrunspecifictests.template.xml' e substituir cada ocorrência do string "<runTest></runTest>" com todo o conteúdo de SPECTESTS.
Como você notou, é altamente provável que isso seja quebrado se houver algum caractere especial em specifictests.xml. Em particular, as novas linhas em $SPECTESTS estão interrompendo o meio do comando “s”, como diz o erro; as novas linhas teriam que ser escapadas para que o sed continuasse lendo o comando.
Parece que tudo o que você realmente deseja fazer é acrescentar "<deploy>" e acrescentar "</deploy>" ao conteúdo de specifictests.xml? Isso está certo?
Nesse caso, você poderia simplesmente fazer
{ echo "<deploy>"; cat "$SPECTESTSFILE"; echo "</deploy>"; } > "$BUILDXML_TEMPLATE_FILE"
Se isso não funcionar, para contornar especificamente as novas linhas no $SPECTESTS
, você pode substituí-las por outra coisa antes de alimentá-las no sed e, em seguida, transformá-las novamente em novas linhas após a conclusão do sed, assim:
SPECTESTS="$(tr '\n' '\r' < $SPECTESTSFILE)"
sed "s|<runTest><\/runTest>|$SPECTESTS|g" $BUILDXML_TEMPLATE_FILE | tr '\r' '\n'
Isso coloca o resultado na saída padrão, e não de volta em buildrunspecifictests.template.xml. (Mas parece que você pode querer o resultado em um arquivo diferente de qualquer maneira, caso contrário você quebrará futuras substituições.)
Isso ainda é suscetível a outros caracteres problemáticos que aparecem em $SPECTESTS, como |, & ou \.
Você pode tentar as soluções emComando sed para substituir uma string de um arquivo pelo conteúdo inteiro de outro arquivo.