Bash RegEx no OSX Vs Linux (esquisitos)

3

Trata-se de desenvolvimento Bash e codificação de scripts Bash portáteis que usam RegEx .

Usando o Bash RegEx, em um Mac, posso fazer isso:

coconut-mac$ a='bananacoconutman'; [[ "$a" =~ banana(.*?)man ]] && echo FOUND ${BASH_REMATCH[1]}
FOUND coconut

Legal. Útil em muitos lugares. Como.

Quando tento fazer isso, ele falha:

coconut-mac$ a='<title>coconut</title>'; [[ "$a" =~ \<title\>(.*?)\</title\> ]] && echo FOUND ${BASH_REMATCH[1]}

O mesmo comando exato é executado perfeitamente no pinguim:

coconut-linux$ a='<title>coconut</title>'; [[ "$a" =~ \<title\>(.*?)\</title\> ]] && echo FOUND ${BASH_REMATCH[1]}
FOUND coconut
  • Por quê?
  • Como consertar isso para tornar o script portátil?

EDITAR : no Mac:

OS X version: 10.8.2
Bash version: 4.2.37(2)-release

no Ubuntu 12.04 LTS:

Linux kernel version: 3.2.0-29-generic-pae
Linux version: Ubuntu 12.04.1 LTS
Bash version: 4.2.24(1)-release
    
por Robottinosino 03.10.2012 / 04:21

2 respostas

4

No meu Mac, info bash / =~ RET diz:

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

man 3 regex diz:

A repetition operator (?',*', +', or bounds) cannot follow another repetition operator. A repetition operator cannot begin an expression or subexpression or follow^' or '|'.

Eu não vejo nenhuma documentação análoga no man 3 regex ou info regex do GNU regex.

Se eu remover o ? do seu (.*?) e fizer o seguinte, ele funcionará nos dois sistemas operacionais:

$ a='<title>coconut</title>'; [[ "$a" =~ \<title\>(.*)\</title\> ]] && echo FOUND ${BASH_REMATCH[1]}
FOUND coconut
    
por 03.10.2012 / 04:31
3

Esta provavelmente seria a resposta:

Bash padrão em Darwin (10.8.1 / 2):

GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)

Bash padrão, digamos, Ubuntu 12 LTS:

GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu)

Tornar portátil seria afastar-se das novas peculiaridades bash e usar coisas como sed , awk , whatnot.

    
por 03.10.2012 / 04:28

Tags