sed: -e 式 #1、文字 73: 終了していない 's' コマンド

sed: -e 式 #1、文字 73: 終了していない 's' コマンド

私は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"

それでもうまくいかない場合は、改行文字を具体的に処理するために$SPECTESTSsedに供給する前にそれを別のものに置き換えて、sedが完了したら、次のように改行文字に戻すことができます。

SPECTESTS="$(tr '\n' '\r' < $SPECTESTSFILE)"
sed "s|<runTest><\/runTest>|$SPECTESTS|g" $BUILDXML_TEMPLATE_FILE | tr '\r' '\n'

これにより、結果がbuildrunspecialtests.template.xmlとして返されるのではなく、標準出力に表示されます。 (ただし、結果を別のファイルに保存したい場合があります。そうしないと、今後の置換は中止されます。)

ただし、|、&、\など、$SPECTESTSに現れる問題がある他の文字にはまだ脆弱です。

次の回避策を試すことができます。sed コマンドは、あるファイルの文字列を別のファイルの内容全体に置き換えます。

おすすめ記事