
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 sponge
vonmehrutils, 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 sed
stattdessen mehrere Befehle.
sed "command1;command2;command3" < ../oldfile.html > newFile