我对 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 命令将一个文件中的字符串替换为另一个文件的全部内容。