Bash padrões de expressão regular que correspondem a espaços, dentro do teste de colchetes duplos, usando o operador “~ =”

4

Simplificando, não consigo encontrar uma maneira de combinar uma variável com algum padrão que contenha espaços.

Aqui está o que eu esperava para funcionar (echo 'ok' string)

item='foobar baz'
pat=".+bar baz"
if [[ "$item" =~ "$pat" ]] ; then
    echo ok
fi

Adicionar / remover citações em torno de $ pat não parece fazer nenhuma diferença. Eu obtenho esses dois erros abaixo:

bash: conditional binary operator expected
bash: syntax error near '~='

Alguém por favor pode me ajudar a apontar o que estou fazendo de errado aqui? Devo colocar o padrão imediatamente (sem aspas / aspas duplas, nem a referência de variável)? Se for esse o caso, como posso colocar espaços? (usando reg-exp matching, não uma alternativa)

Obrigado!

    
por Stphane 24.12.2015 / 19:02

1 resposta

3

O erro de sintaxe é auto-explicativo, ou seja, você usou ~= em vez de =~ .

Em relação ao padrão Regex, use apenas $pat (e também $item ), sendo que um shell integrado em [[ pode manipular a divisão de palavras:

item='foobar baz'
pat=".+bar baz"
if [[ $item =~ $pat ]]; then
    echo ok
fi

Quando você usa aspas duplas em torno de $pat , ou seja, "$pat" , os tokens Regex . e + são tratados literalmente.

Exemplo:

$ item='foobar baz'; pat=".+bar baz"; if [[ $item =~ $pat ]]; then echo OK; fi
OK
    
por 24.12.2015 / 19:12