Verwenden Sie Bash
Sie benötigen dazu kein externes Programm, zumal Sie anscheinend den letzten Punkt durch einen Bindestrich ersetzen möchten . Bash kann String-Manipulationen selbst durchführen.
Vorausgesetzt du hast
vers='version: 1.8.0.110'
Die Antwort lautet einfach:
$ echo ${vers%.*}-${vers##*.}
1.8.0-110
% Bedeutet, dass die kürzeste übereinstimmende Zeichenfolge rechts gelöscht wird. Das ## bedeutet, dass die längste übereinstimmende Zeichenfolge links gelöscht wird.
Was ist, wenn es mehr als drei Perioden gibt?
Wenn Sie tatsächlich die dritte Periode ersetzen möchten, nicht die letzte Periode, wie ich oben angenommen habe, wird es in Bash etwas schwieriger, aber es ist immer noch möglich. Wenn Sie beispielsweise vers='version: 1.8.0.110.hut.hut.hut.hike!'
nach der dritten Periode alles finden und damit die Zeichenfolge abschneiden können:
$ end=${vers#*.*.*.}
$ start=${vers%$end}
$ echo ${start%.}-$end
version: 1.8.0-110.hut.hut.hut.hike!
Eine andere Möglichkeit: Verwenden Sie IFS, um Zeichenfolgen in ein Bash-Array aufzuteilen
Während dies für die Frage übertrieben ist, ist es manchmal nützlich, eine Zeichenfolge in Komponenten aufzuteilen und diese in ein Array zu laden.
IFS=. read -a foo <<<'version: 1.8.0.110.hut.hut.hut.hike!'
Sie können das Array durchlaufen $foo
und auswählen, was wann gedruckt werden soll. Zum Beispiel,
echo -n $foo
for ((i=1; i<${foo[@]}; i++)); do
[[ i -eq 3 ]] && echo -n - || echo -n .
echo -n ${foo[i]};
done
echo