Estou tentando extrair dois valores numéricos de uma string e atribuí-los a variáveis usando awk
( gawk
é o que estou usando especificamente). Eu quero puxar os números de versão principais e secundários de uma string de versão do tmux para awk
variáveis, por exemplo:
- entrada
tmux 2.8
:;maj == 2
emin == 8
- entrada
tmux 1.9a
:;maj == 1
emin == 9
- entrada
tmux 2.10
:;maj == 2
emin == 10
Assumindo que minha entrada vem do tmux -V
stdin, atualmente tenho o seguinte:
tmux -V | awk '{
maj = +gensub(/([0-9]+)\..*/, "\\1", "g", $2);
min = +gensub(/.*\.([0-9]+).*/, "\\1", "g", $2);
# ...do something with maj and min...
}'
Isso funciona, mas como muitos usuários de tmux saber, usando if-shell
no .tmux.conf
arquivo (onde espero usar este material) pode facilmente levar a muito longas filas no arquivo de configuração, então eu estou querendo saber se há uma maneira de combinar essas duas variáveis atribuições em uma instrução para economizar espaço ... ou qualquer outra maneira de coletar essas duas variáveis da entrada e economizar espaço.
Estou pensando em algo como:
awk '{ maj, min = +gensub(/([0-9]+)\.([0-9]+).*/, "\\1 \\2", "g", $2); }'
... como em Python, mas essa sintaxe específica não existe awk
. Existe mais alguma coisa possível?
Observe que a legibilidade não é realmente uma preocupação, apenas o comprimento.
Como você está usando o GNU awk, você pode usar a forma de três argumentos
match()
para armazenar vários grupos de captura:https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
fonte
Você pode dividir a versão em uma matriz:
então use em
ver[1]
vez demaj
, emver[2]
vez demin
.A adição
a-z
ao separador remove qualquer letra minúscula do número da versão. (As outras soluções são melhores aqui, pois extraem números explicitamente.)fonte
Outro usuário postou esta resposta e mais tarde foi excluída. Eu pensei que era útil:
Usando a
split()
função, divida a string da versão em uma matrizver
, acessever[1]
e emver[2]
vez demaj
emin
, respectivamente (ou simplesmente armazene os valores nessas variáveis):A vantagem aqui é que
split()
não é umagawk
extensão (embora seu quarto argumento opcionalseps
seja).fonte
/[.a-z]/
como o terceiro argumento (separação de campo) dasplit
função string, em vez de apenas"."
?