Kein Ergebnis bei Verwendung von Multiple Write File & sed im Shell-Skript

Kein Ergebnis bei Verwendung von Multiple Write File & sed im Shell-Skript

Ich möchte Variablen aus der alten Datei in die neue Datei austauschen, wenn ich eine einzelne Zeile wie diese verwende

cat ../oldFile.html | sed "s@$dayMaxInNew@$dayMaxIn@g" > newFile

Es gibt ein Ergebnis von newFile.

Aber wenn ich mehr als 2 Zeilen verwende, ist das Folgende:

cat ../oldFile.html | sed "s@$dayMaxInNew@$dayMaxIn@g" > newFile

cat newFile | sed "s@$dayAvgInNew@$dayAvgIn@g" > newFile

cat newFile | sed "s@$dayCurInNew@$dayCurIn@g" >  newFile

kein Ergebnis von newFile. Ich versuche, sleep zu verwenden, aber es funktioniert nicht. PS. In der 2. und 3. Zeile tausche ich die Variable in derselben Datei. Irgendwelche Ratschläge?

Antwort1

Die Umleitung löscht die Datei, bevor der Befehl ausgeführt wird. Der Befehl spongevonmehrutils, saugt seine Standardeingabe auf, bevor es in eine Datei schreibt. Auf diese Weise wird die Datei überschrieben, nachdem der Befehl ausgeführt wurde.

cat ../oldFile.html | sed "s@$dayMaxInNew@$dayMaxIn@g" > newFile
cat newFile | sed "s@$dayAvgInNew@$dayAvgIn@g" | sponge newFile
cat newFile | sed "s@$dayCurInNew@$dayCurIn@g" | sponge  newFile

Wenn Sie keine moreutils haben, können Sie temporäre Dateien verwenden. Beachten Sie auch, dass Sie nicht verwenden müssen cat.

sed "s@$dayMaxInNew@$dayMaxIn@g" < ../oldFile.html > newFile
sed "s@$dayAvgInNew@$dayAvgIn@g" < newFile | sponge newFile
sed "s@$dayCurInNew@$dayCurIn@g" < newFile | sponge  newFile

Und schließlich können Sie mehrere sed-Befehle zu einem kombinieren.

sed "s@$dayMaxInNew@$dayMaxIn@g
     s@$dayAvgInNew@$dayAvgIn@g
     s@$dayCurInNew@$dayCurIn@g" < ../oldFile.html > newFile

oder

sed -e "s@$dayMaxInNew@$dayMaxIn@g" \
    -e "s@$dayAvgInNew@$dayAvgIn@g" \
    -e "s@$dayCurInNew@$dayCurIn@g" < ../oldFile.html > newFile

Antwort2

Verwenden Sie niemals Daten aus einer Datei, zu der Sie umleiten. Die Umleitung zerstört die Datei, normalerweise bevor Sie eine Chance hatten, sie zu lesen. Verwenden Sie sedstattdessen mehrere Befehle.

sed "command1;command2;command3" < ../oldfile.html > newFile

verwandte Informationen