Estoy tratando de extraer dos valores numéricos de una cadena y asignarlos a variables usando awk
( gawk
es 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 awk
variables, por ejemplo:
- entrada
tmux 2.8
:;maj == 2
ymin == 8
- entrada
tmux 1.9a
:;maj == 1
ymin == 9
- entrada
tmux 2.10
:;maj == 2
ymin == 10
Suponiendo que mi entrada proviene de tmux -V
stdin, 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-shell
en el .tmux.conf
archivo (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-z
al 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 demaj
ymin
, respectivamente (o simplemente almacene los valores en esas variables):La ventaja aquí es que
split()
no es unagawk
extensión (aunque su cuarto argumento opcional sí loseps
es).fuente
/[.a-z]/
como el tercer argumento (separación de campo) de lasplit
función de cadena, en lugar de solo"."
?