RegEx no bash para extrair string após o primeiro delimitador

3

Esta pergunta não é uma duplicação de quaisquer outras perguntas por aqui, pois preciso de um regex em bash com a =~ correspondente.

Supondo que eu tenha uma string como

string="ananas1kiwi2apple1banana2tree"

O regEx que experimentei foi

[[ $string =~ .*2([[:alnum:]]{1,}) ]] && subString=${BASH_REMATCH[1]}

que deveria coincidir com a ocorrência de 2 e capturar tudo além disso, que está me retornando apenas tree (string após a segunda partida). Minha saída esperada é apple1banana2tree

Eu sei que estou perdendo uma construção simples, mas não sei exatamente qual. Estou procurando apenas uma solução baseada em bash regEx . Além disso, nenhuma manipulação de string que eu saiba pode ser feita por "{string#*2}"

    
por Inian 09.11.2016 / 13:50

1 resposta

2

Combine apenas 2 e capture tudo além de .* :

[[ $string =~ 2(.*) ]] && echo "${BASH_REMATCH[1]}"

Exemplo:

$ string="ananas1kiwi2apple1banana2tree"

$ [[ $string =~ 2(.*) ]] && echo "${BASH_REMATCH[1]}"
apple1banana2tree

Qual é o problema com o seu:

  • .* é ganancioso, corresponde à última 2 quando você usa .*2 , para não ter ganância (como .*? não está disponível em ERE) use [^2]*2

  • Também {1,} é apenas +

Então faça:

[[ $string =~ [^2]*2([[:alnum:]]+) ]]

Em qualquer caso, não é necessário fazer a correspondência desde o início, apenas faça:

[[ $string =~ 2([[:alnum:]]+) ]]
    
por 09.11.2016 / 13:53