Я совсем новичок в SH и разработке и продираюсь через код, находя по одной ошибке за раз.
Я наткнулся на эту ошибку и теперь не могу разобраться в ней. Любая помощь была бы здоровой!
Я запускаю скрипт sh в GitHub Actions и получаю следующую ошибку:
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
В моем файле manifest/specifictests.xml есть список RunTests с новыми строками
<runTest>...</runTest>
<runTest>....</runTest>
и я хочу вставить этот список в файл buildFiles/buildrunspecifictests.template.xml
<deploy>
<runTest></runTest>
</deploy>
В конечном итоге я хочу, чтобы файл выглядел так:
<deploy>
<runTest>...</runTest>
<runTest>....</runTest>
</deploy>
Я обнаружил, что если в файле manifest/specifictests.xml нет новых строк, то он работает, но это не дает мне большой свободы для пользователя при его использовании или в конечном итоге для автоматизации создания этого файла в другом месте.
Кто-нибудь знает, как это исправить?
решение1
Похоже, вы перенесли все содержимое файла «manifest/specifictests.xml» в переменную SPECTESTS и даете указание выполнить sed
поиск по файлу «buildFiles/buildrunspecifictests.template.xml» и заменить все вхождения строки «<runTest></runTest>» всем содержимым SPECTESTS.
Как вы заметили, это может привести к поломке, если в Specifictests.xml есть какие-либо специальные символы. В частности, новые строки в $SPECTESTS прерывают середину команды "s", как указано в ошибке; новые строки должны быть экранированы, чтобы sed мог продолжить чтение команды.
Похоже, что все, что вы на самом деле хотите сделать, это добавить "<deploy>" в начало и "</deploy>" в конец к содержимому Specifictests.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'
Это помещает результат в стандартный вывод, а не обратно в buildrunspecifictests.template.xml. (Но, похоже, вам в любом случае может понадобиться результат в другом файле, иначе вы нарушите будущие замены.)
Однако это по-прежнему подвержено появлению других проблемных символов в $SPECTESTS, таких как |, & или \.
Вы можете попробовать решения накоманда sed для замены строки из одного файла всем содержимым другого файла.