sed: -e выражение #1, символ 73: незавершенная команда `s'

sed: -e выражение #1, символ 73: незавершенная команда `s'

Я совсем новичок в 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 для замены строки из одного файла всем содержимым другого файла.

Связанный контент