sed: -e Ausdruck Nr. 1, Zeichen 73: nicht beendeter „s“-Befehl

sed: -e Ausdruck Nr. 1, Zeichen 73: nicht beendeter „s“-Befehl

Ich bin ein völliger Neuling in Sachen SH und Entwicklung und stolpere Fehler für Fehler durch den Code.

Ich bin jetzt auf diesen Fehler gestoßen, dem ich nicht auf den Grund gehen kann. Jede Hilfe wäre großartig!

Ich führe ein SH-Skript in GitHub Actions aus und erhalte diesen Fehler:

sed: -e expression #1, char 73: unterminated `s' command

Hier ist mein Code:

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

In meiner Datei manifest/specifictests.xml habe ich eine Liste von RunTests mit neuen Zeilen

<runTest>...</runTest>
<runTest>....</runTest>

und ich möchte diese Liste in die Datei buildFiles/buildrunspecifictests.template.xml einfügen

<deploy>
    <runTest></runTest>
</deploy>

Letztendlich soll die Datei so aussehen:

<deploy>
   <runTest>...</runTest>
   <runTest>....</runTest>
</deploy>

Ich habe herausgefunden, dass es funktioniert, wenn die Datei „manifest/specifictests.xml“ keine Zeilenumbrüche enthält. Das lässt mir jedoch nicht viel Spielraum bei der Verwendung durch den Benutzer oder bei der eventuellen Automatisierung der Erstellung dieser Datei an anderer Stelle.

Kennt jemand eine Lösung?

Antwort1

Es scheint, als hätten Sie den gesamten Inhalt der Datei „manifest/specifictests.xml“ in die Variable SPECTESTS eingefügt und weisen an, seddie Datei „buildFiles/buildrunspecifictests.template.xml“ zu durchsuchen und jedes Vorkommen der Zeichenfolge „<runTest></runTest>“ durch den gesamten Inhalt von SPECTESTS zu ersetzen.

Wie Sie bemerkt haben, kann dies sehr leicht abbrechen, wenn in specifictests.xml Sonderzeichen vorhanden sind. Insbesondere unterbrechen die Zeilenumbrüche in $SPECTESTS die Mitte des „s“-Befehls, wie der Fehler besagt; die Zeilenumbrüche müssten maskiert werden, damit sed den Befehl weiterlesen kann.

Es klingt, als ob Sie eigentlich nur „<deploy>“ voranstellen und „</deploy>“ an den Inhalt von specifictests.xml anhängen möchten? Ist das richtig?

In diesem Fall könnten Sie einfach tun

{ echo "<deploy>"; cat "$SPECTESTSFILE"; echo "</deploy>"; } > "$BUILDXML_TEMPLATE_FILE"

Wenn dies nicht funktioniert, können Sie, um Zeilenumbrüche in gezielt zu umgehen $SPECTESTS, diese durch etwas anderes ersetzen, bevor Sie es an sed weitergeben, und sie dann, nachdem sed fertig ist, wie folgt wieder in Zeilenumbrüche umwandeln:

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

Dadurch wird das Ergebnis auf die Standardausgabe gesetzt und nicht zurück in buildrunspecifictests.template.xml. (Aber es scheint, als ob Sie das Ergebnis ohnehin in einer anderen Datei haben möchten, da Sie sonst zukünftige Ersetzungen unterbrechen.)

Dies ist jedoch immer noch anfällig für andere problematische Zeichen, die in $SPECTESTS auftauchen, wie |, & oder \.

Sie können die Lösungen ausprobieren untersed-Befehl zum Ersetzen einer Zeichenfolge aus einer Datei durch den gesamten Inhalt einer anderen Datei.

verwandte Informationen