Ich habe eine Textdatei, in der ich Versionen speichere:
1.0
2.0
3.0
4.0
5.0
und so weiter.
Ich brauche beispielsweise eine Möglichkeit, 4.0
als Eingabe Folgendes anzugeben und 3.0
als Ausgabe abzurufen. Beachten Sie, dass es Tausende von Versionen geben würde.
Ich meine, ich möchte eine Versionsnummer angeben und die Nummer der vorherigen Version erhalten. Wenn ich also eingebe 9.0
, erhalte ich 8.0
.
Ich habe es versucht
sed '1!G;h;$!d' test.txt
Aber hier werden alle Zahlen gedruckt.
Antwort1
Sie können dies tun mit bc
(sieheGNU BC-Handbuch). Sie können bc
einen arithmetischen Ausdruck übergeben und bc
dieser wird ausgewertet und das Ergebnis zurückgegeben, z. B.
echo '9.0 - 1' | bc -l
Dieser Befehl gibt 8.0
als Ergebnis zurück.
Nehmen wir nun an, dass Ihre Versionsnummer in der Datei enthalten ist version.txt
, zum Beispiel:
echo '9.0' > version.txt
Anschließend könnten Sie den folgenden Befehl ausführen:
echo "$(cat version.txt) - 1" | bc -l
Als Ausgabe würde dies erscheinen 8.0
. Alternativ können Sie auch annehmen, dass Sie eine Liste von Versionsnummern in einer Datei mit versions.txt
dem Namen haben:
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0
10.0
Wir könnten eine solche Datei wie folgt erstellen:
for i in {1..10}; do echo "${i}.0" >> versions.txt; done
In diesem Fall könnten wir Folgendes bc
innerhalb einer While-Schleife verwenden:
while read line; do echo "${line}-1" | bc -l; done < versions.txt
Dies erzeugt die folgende Ausgabe:
0
1.0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0
Alternativ können Sie den ganzzahligen Teil aus der Versionsnummer extrahieren und bash
für die Berechnung verwenden. Sie können hierfür eine beliebige Anzahl von Textverarbeitungsprogrammen verwenden (z. B. grep
, sed
, awk
, usw.). Hier ist ein Beispiel mit dem folgenden cut
Befehl:
echo "$(( $(echo '9.0' | cut -d. -f1) - 1)).0"
Als Ausgabe wird Folgendes ausgegeben 8.0
. Wenn wir dies in eine While-Schleife einfügen, erhalten wir Folgendes:
while read line; do \
echo "$(( $(echo ${line} | cut -d. -f1) - 1)).0";
done < versions.txt