J'essaie de tirer deux valeurs numériques d'une chaîne et de les affecter à des variables à l'aide awk
( gawk
c'est ce que j'utilise spécifiquement). Je veux extraire les numéros de version majeurs et mineurs d'une chaîne de version tmux dans des awk
variables, par exemple:
- entrée
tmux 2.8
:;maj == 2
etmin == 8
- entrée
tmux 1.9a
:;maj == 1
etmin == 9
- entrée
tmux 2.10
:;maj == 2
etmin == 10
En supposant que mon entrée provient de tmux -V
stdin, j'ai actuellement les éléments suivants:
tmux -V | awk '{
maj = +gensub(/([0-9]+)\..*/, "\\1", "g", $2);
min = +gensub(/.*\.([0-9]+).*/, "\\1", "g", $2);
# ...do something with maj and min...
}'
Cela fonctionne, mais comme de nombreux utilisateurs de tmux le savent, l'utilisation if-shell
dans le .tmux.conf
fichier (où j'espère utiliser ce genre de choses) peut facilement conduire à de très longues lignes dans le fichier de configuration, donc je me demande s'il existe un moyen de combiner ces deux variables affectations en une seule instruction pour économiser de l'espace ... ou de toute autre manière pour glaner ces deux variables de l'entrée et économiser de l'espace.
Je pense à quelque chose comme:
awk '{ maj, min = +gensub(/([0-9]+)\.([0-9]+).*/, "\\1 \\2", "g", $2); }'
... un peu comme en Python, mais cette syntaxe particulière n'existe pas dans awk
. Y a-t-il autre chose possible?
Notez que la lisibilité n'est pas vraiment un problème, juste la longueur.
Puisque vous utilisez GNU awk, vous pouvez utiliser la forme 3-arg
match()
pour stocker plusieurs groupes de capture:https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
la source
Vous pouvez diviser la version en un tableau:
puis utilisez
ver[1]
au lieu demaj
,ver[2]
au lieu demin
.L'ajout
a-z
au séparateur supprime toute lettre minuscule du numéro de version. (Les autres solutions sont meilleures ici car elles extraient explicitement des nombres.)la source
Un autre utilisateur a publié cette réponse, qui a été supprimée par la suite. J'ai pensé que c'était utile:
À l'aide de la
split()
fonction, divisez la chaîne de version en un tableauver
, puis accédez àver[1]
etver[2]
plutôt qu'àmaj
etmin
, respectivement (ou stockez simplement les valeurs dans ces variables):Le plus ici est que ce
split()
n'est pas unegawk
extension (bien que son quatrième argument facultatifseps
soit).la source
/[.a-z]/
comme troisième argument (séparation de champs) de lasplit
fonction chaîne, au lieu de juste"."
?