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