/ / Bash Regex Capture - regex, linux, bash, macos

Bash Regex Capture - regex, linux, bash, macos

Eu gostaria de capturar partes de strings que correspondem a uma expressão regular (veja o código abaixo). Por exemplo: apply plugin: "java" Eu gostaria de capturar java.

Eu coloquei o seguinte regex. Quando eu executo o código abaixo (no Linux ou Mac OS) uma correspondência é encontrada, mas o BASH_REMATCH array está vazio (isto é, comprimento de zero).

Alguém sabe o que há de errado com o regex e / ou sua aplicação?

regex="^[[:space:]]*apply[[:space:]]*plugin:[[:space:]]*"([[:alpha:]]+)"[[:space:]]*$"

if [[ "$line" =~ $regex ]]; then
echo "Match count is ${#BASH_REMATCH[@]}."
echo ${BASH_REMATCH[1]}
else
echo "No match."
fi

Respostas:

1 para resposta № 1

Não consigo reproduzir isso como postado no macOS. Você pode ter uma armadilha de depuração ou um conjunto semelhante.

Para ajudar a depurar isso, edite sua pergunta para incluir:

  1. O script completo que você executa (ou seja, incluindo o que preenche $line)
  2. O comando completo que você usa para executá-lo e a saída completa
  3. xtrace bash (-xsaída

Eu expandi seu código em um MCVE usando informações de seus comentários:

$ cat myfile
regex="^[[:space:]]*apply[[:space:]]*plugin:[[:space:]]*"([[:alpha:]]+)"[[:space:]]*$"

line="apply plugin: "java""

if [[ "$line" =~ $regex ]]; then
echo "Match count is ${#BASH_REMATCH[@]}."
echo ${BASH_REMATCH[1]}
else
echo "No match."
fi

Então eu corri assim e recebi a saída esperada:

$ bash myfile
Match count is 2.
java

Aqui está a saída com informações de depuração em:

$ bash -x myfile
+ regex="^[[:space:]]*apply[[:space:]]*plugin:[[:space:]]*"""([[:alpha:]]+)"""[[:space:]]*$"
+ line="apply plugin: """java""""
+ [[ apply plugin: "java" =~ ^[[:space:]]*apply[[:space:]]*plugin:[[:space:]]*"([[:alpha:]]+)"[[:space:]]*$ ]]
+ echo "Match count is 2."
Match count is 2.
+ echo java
java

Aqui está a informação do sistema:

$ uname -a && bash --version
Darwin hostname 17.4.0 Darwin Kernel Version 17.4.0: Sun Dec 17 09:19:54 PST 2017; root:xnu-4570.41.2~1/RELEASE_X86_64 x86_64
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
Copyright (C) 2007 Free Software Foundation, Inc.

Eu posso adicionar reproduzir os mesmos resultados por, e. adicionando trap "[[ a =~ b ]]" DEBUG para o script. Se você está fazendo algo assim, ele aparecerá no -x saída.