我對 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/specifiedtests.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 指令將一個檔案中的字串替換為另一個檔案的全部內容。