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 № 1Nã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:
- O script completo que você executa (ou seja, incluindo o que preenche
$line
) - O comando completo que você usa para executá-lo e a saída completa
- xtrace bash (
-x
saí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.