Ich versuche, zwei numerische Werte aus einer Zeichenfolge zu ziehen und sie mithilfe von Variablen zuzuweisen awk
( gawk
was ich speziell verwende). Ich möchte die Haupt- und Nebenversionsnummern aus einer tmux-Versionszeichenfolge in awk
Variablen ziehen, z.
- Eingabe :
tmux 2.8
;maj == 2
undmin == 8
- Eingabe :
tmux 1.9a
;maj == 1
undmin == 9
- Eingabe :
tmux 2.10
;maj == 2
undmin == 10
Angenommen, meine Eingabe stammt von tmux -V
stdin, habe ich derzeit Folgendes:
tmux -V | awk '{
maj = +gensub(/([0-9]+)\..*/, "\\1", "g", $2);
min = +gensub(/.*\.([0-9]+).*/, "\\1", "g", $2);
# ...do something with maj and min...
}'
Dies funktioniert, aber wie viele Benutzer von tmux wissen, kann die Verwendung if-shell
in der .tmux.conf
Datei (wo ich dieses Zeug verwenden möchte ) leicht zu sehr langen Zeilen in der Konfigurationsdatei führen. Daher frage ich mich, ob es eine Möglichkeit gibt, diese beiden Variablen zu kombinieren Zuweisungen in eine Anweisung, um Platz zu sparen ... oder eine andere Möglichkeit, diese beiden Variablen aus der Eingabe zu entnehmen und Platz zu sparen.
Ich denke an etwas wie:
awk '{ maj, min = +gensub(/([0-9]+)\.([0-9]+).*/, "\\1 \\2", "g", $2); }'
... ähnlich wie in Python, aber diese spezielle Syntax existiert in nicht awk
. Gibt es noch etwas, das möglich ist?
Beachten Sie, dass die Lesbarkeit nicht wirklich ein Problem ist, sondern nur die Länge.
Da Sie GNU awk verwenden, können Sie die 3-Argumente-Form von verwenden
match()
, um mehrere Erfassungsgruppen zu speichern:https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
quelle
Sie können die Version in ein Array aufteilen:
verwenden Sie dann
ver[1]
stattmaj
,ver[2]
stattmin
.Durch Hinzufügen
a-z
zum Trennzeichen werden Kleinbuchstaben aus der Versionsnummer entfernt. (Die anderen Lösungen sind hier besser, da sie explizit Zahlen extrahieren.)quelle
Ein anderer Benutzer hat diese Antwort gepostet und sie wurde später gelöscht. Ich fand es nützlich:
Mit Hilfe der
split()
Funktion, teilen Sie die Versionszeichenfolge in ein Arrayver
, dann Zugangver[1]
undver[2]
stattmaj
undmin
jeweils (oder einfach speichern die Werte in diesen Variablen):Das Plus hier ist, dass
split()
es sich nicht um einegawk
Erweiterung handelt (obwohl das optionale vierte Argumentseps
lautet).quelle
/[.a-z]/
als drittes Argument (Feldtrennung) dersplit
Zeichenfolgenfunktion verwenden, anstatt nur"."
?