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 ).