Shell-Script

sed: -e 表達式 #1, char 73: 未終止的 `s’ 命令

  • October 28, 2021

我對 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

在我的 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 文件中沒有換行符,那麼它可以工作,但這並沒有讓我有太多的自由讓使用者使用它或最終在其他地方自動創建這個文件。

有誰知道修復?

似乎您已將文件“manifest/specifictests.xml”的全部內容放入變數 SPECTESTS 中,並且您指示sed搜尋文件“buildFiles/buildrunspecifictests.template.xml”並替換每次出現的字元串 “<runTest></runTest>” 包含 SPECTESTS 的全部內容。

正如您所注意到的,如果 specifictests.xml 中有任何特殊字元,這很容易被破壞。特別是,如錯誤所述,$SPECTESTS 中的換行符會中斷“s”命令的中間;sed 必須轉義換行符才能繼續閱讀命令。

聽起來您實際上想要做的只是將“<deploy>”和“</deploy>”附加到 specifictests.xml 的內容?那正確嗎?

在這種情況下,你可以這樣做

{ echo "&lt;deploy&gt;"; cat "$SPECTESTSFILE"; echo "&lt;/deploy&gt;"; } &gt; "$BUILDXML_TEMPLATE_FILE"

如果這不起作用,那麼要專門解決 中的換行符$SPECTESTS,您可以在將其提供給 sed 之前將它們替換為其他內容,然後在 sed 完成後將它們重新轉換為換行符,如下所示:

SPECTESTS="$(tr '\n' '\r' &lt; $SPECTESTSFILE)"
sed "s|&lt;runTest&gt;&lt;\/runTest&gt;|$SPECTESTS|g" $BUILDXML_TEMPLATE_FILE | tr '\r' '\n'

這會將結果放在標準輸出中,而不是返回到 buildrunspecifictests.template.xml。(但似乎您可能希望將結果保存在不同的文件中,否則您將破壞未來的替換。)

但是,這仍然容易受到 $SPECTESTS 中出現的其他問題字元的影響,例如 |、& 或 \。

您可以嘗試sed 命令中的解決方案,將一個文件中的字元串替換為另一個文件的全部內容

引用自:https://unix.stackexchange.com/questions/675193