Estoy tratando de extraer dos valores numéricos de una cadena y asignarlos a variables usando awk( gawkes lo que estoy usando específicamente). Quiero extraer los números de versión mayor y menor de una cadena de versión tmux en awkvariables, por ejemplo:
- entrada
tmux 2.8:;maj == 2ymin == 8 - entrada
tmux 1.9a:;maj == 1ymin == 9 - entrada
tmux 2.10:;maj == 2ymin == 10
Suponiendo que mi entrada proviene de tmux -Vstdin, actualmente tengo lo siguiente:
tmux -V | awk '{
maj = +gensub(/([0-9]+)\..*/, "\\1", "g", $2);
min = +gensub(/.*\.([0-9]+).*/, "\\1", "g", $2);
# ...do something with maj and min...
}'
Esto funciona, pero como muchos usuarios de tmux saben, usar if-shellen el .tmux.confarchivo (donde espero usar esto) puede conducir fácilmente a líneas realmente largas en el archivo de configuración, por lo que me pregunto si hay una manera de combinar estas dos variables asignaciones en una declaración para ahorrar espacio ... o cualquier otra forma de recoger estas dos variables de la entrada y ahorrar espacio.
Estoy pensando en algo como:
awk '{ maj, min = +gensub(/([0-9]+)\.([0-9]+).*/, "\\1 \\2", "g", $2); }'
... algo así como en Python, pero esa sintaxis particular no existe en awk. ¿Hay algo más que sea posible?
Tenga en cuenta que la legibilidad no es realmente una preocupación, solo la longitud.

Como está usando GNU awk, puede usar la forma de 3 argumentos
match()para almacenar múltiples grupos de captura:https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
fuente
Puede dividir la versión en una matriz:
luego use en
ver[1]lugar demaj, enver[2]lugar demin.Agregar
a-zal separador elimina cualquier letra minúscula del número de versión. (Las otras soluciones son mejores aquí ya que extraen números explícitamente).fuente
Otro usuario publicó esta respuesta, y luego fue eliminada. Pensé que era útil:
Usando la
split()función, divida la cadena de versión en una matrizver, luego accedaver[1]y enver[2]lugar demajymin, respectivamente (o simplemente almacene los valores en esas variables):La ventaja aquí es que
split()no es unagawkextensión (aunque su cuarto argumento opcional sí losepses).fuente
/[.a-z]/como el tercer argumento (separación de campo) de lasplitfunción de cadena, en lugar de solo"."?