sed: -e 式 #1、文字 73: `s' コマンドが終了していません

sed: -e 式 #1、文字 73: `s' コマンドが終了していません

私は SH と開発に非常に不慣れで、一度に 1 つのエラーが発生しながらコードを進めています。

原因が分からないエラーに遭遇しました。どなたか助けていただけると嬉しいです。

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

私の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 がコマンドを読み取り続けるには、改行をエスケープする必要があります。

実際にやりたいことは、specifictests.xml の内容の先頭に「<deploy>」を追加し、「</deploy>」を追加することだけのように思われますが、正しいでしょうか?

その場合は、

{ 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 コマンド

関連情報