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 principal e secundária de uma string de versão do tmux em 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
Supondo que minha entrada venha de 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 do tmux sabem, usar if-shell
no .tmux.conf
arquivo (onde espero usar essas coisas) pode facilmente levar a linhas muito longas no arquivo de configuração, então 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 em particular não existe em awk
. Existe alguma outra coisa que é 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 3 argumentos de
match()
para armazenar vários grupos de captura:https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
Observe que
gensub
é umagawk
extensão, não funcionará com nenhuma outraawk
implementação. Observe também que o+
operador unário não força a conversão numérica em todas asawk
implementações, usando+ 0
é mais portátil.Aqui você poderia fazer:
Se você não se importa em usar
awk
extensões GNU, você também pode fazer:Você pode dividir a versão em uma matriz:
então use
ver[1]
em vez demaj
,ver[2]
em vez demin
.Adicionar
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.)Outro usuário postou esta resposta e depois foi excluída. Achei útil:
Usando a
split()
função, divida a string da versão em um arrayver
, então acessever[1]
ever[2]
em 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).