qual é a melhor maneira de combinar um número de versão do arquivo

0

qual é a melhor maneira de combinar o número da versão específica (ou o número da versão) do arquivo

Eu fiz algumas opções, mas acho que há outra melhor abordagem (como o perl one-liner)

   version=23.092.12
   cat generic_version | grep  "$version"
   cat generic_version | grep -F "$version"
   cat generic_version | awk -v ver=$version '/ver/'

generic_version - é um arquivo com muitas versões flutuantes

exemplo

cat /tmp/generic_version | ......

resultados esperados:

23.092.12 # version approve 

exemplo de arquivo

23.087.23  # version approve 
23.092.12  # version approve 
23.098.45  # version approve 
23.099.12  # version under testing
    
por yael 21.02.2018 / 10:09

3 respostas

1

No mínimo, você deseja corresponder a $version , desde que não seja precedido nem seguido por um dígito ou ponto para evitar correspondência em itens como 23.092.123 ou 1.23.092.12 (embora você também queira Considere casos como 23.092.12-rc1 , 23.092.12b , 23.092.12-2 ...). Pode ser mais fácil com perl :

<generic_version V=$version perl -ne 'print if m{(?<![\d.])\Q$ENV{V}\E(?![\d.])}'

Isso corresponde a:

xxx 23.092.12 yyy
xxx23.092.12yyy
23.092.12-pre1

Mas não em

23.092.12.2
23.092.123
123.092.12
23.092.12.

Os (?<!...) e (?!...) são respectivamente negativos e esperam operadores regex. Usamos \Q...\E para que o conteúdo do env var seja tomado como uma string fixa em vez de um regexp (portanto, . perde seu significado especial de corresponder a qualquer caractere).

Se, de acordo com sua edição, seus números de versão no arquivo de entrada sempre forem encontrados no início da linha e sempre seguidos por um caractere de espaçamento, você poderá simplificá-lo para:

<generic_version V=$version perl -ne 'print if m{^\Q$ENV{V}\E\s}'

Ou use awk para corresponder às linhas cujo primeiro campo é a versão:

<generic_version V=$version awk '$1 "" == ENVIRON["V"]'

A concatenação com "" é forçar uma comparação de string. Sem ele, com um $version como 123.4 , ele corresponderia a 123.40 .

Para corresponder no $version qualquer campo delimitado por espaço na entrada:

<generic_version V=$version perl -ne 'print if m{(?<!\S)^\Q$ENV{V}\E(?!\S)}'

Isso é $version , desde que não seja precedido nem seguido por um caractere sem espaçamento ( \S ).

    
por 21.02.2018 / 10:25
1
Solução

Awk (de acordo com o formato de arquivo de entrada):

version="23.092.12"
awk -v ver="$version" '$1 == ver' /tmp/generic_version

A saída:

23.092.12  # version approve 
    
por 21.02.2018 / 10:34
1

Supondo que o arquivo generic_version contenha um número de versão por linha e que $version corresponda exatamente a uma dessas linhas:

grep -xF "$version" generic_version

O sinal -F faz com que grep interprete o padrão como uma string fixa em vez de uma expressão regular, enquanto -x força a correspondência a abranger toda a linha (como se ^ e $ tivessem usado em um padrão de expressão regular).

Depois de revelar o formato do arquivo na pergunta:

awk -v v="$version" '$1 == v' generic_version

Isso produzirá todas as linhas do arquivo cuja primeira coluna separada por espaço em branco seja idêntica ao valor da variável version .

    
por 21.02.2018 / 10:29