Comportamento estranho de = ~ no bash

1

Então, estou fazendo isso:

[[ 'Comment 1: abcas'  =~ '(?:Comment [0-9]*: )(.*)' ]]

O regex funciona bem com muitos testadores de regex on-line e em js, mas não conseguiu trabalhar no bash. De qualquer forma, a modificação do meu regex para extrair o abcas do

'Comment 1: abcas'

    
por Hellow Hi 24.01.2017 / 04:18

1 resposta

1

De acordo com o manual de Bash :

An additional binary operator, ‘=~’, is available, with the same precedence as ‘==’ and ‘!=’. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex3)). The return value is 0 if the string matches the pattern, and 1 otherwise. If the regular expression is syntactically incorrect, the conditional expression’s return value is 2. If the nocasematch shell option (see the description of shopt in The Shopt Builtin) is enabled, the match is performed without regard to the case of alphabetic characters. Any part of the pattern may be quoted to force the quoted portion to be matched as a string.

Assim, suas aspas ao redor do regex fazem com que o regex inteiro seja tratado como uma correspondência de cadeia simples. Além disso, existem muitos tipos de regex disponíveis e ?: não é suportado por regex(3) - você só tem que verificar o manual para ver o sabor que qualquer ferramenta particular suporta, infelizmente.

No seu caso específico, você pode usar algo como

$ [[ 'Comment 1: abcas' =~ (Comment [0-9]*: )(.*) ]] && echo ${BASH_REMATCH[2]}
abcas
    
por 24.01.2017 / 05:05