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

Bash Regex Capture - regex, linux, bash, macos

Chciałbym uchwycić części ciągów pasujących do wyrażenia regularnego (patrz kod poniżej). Na przykład podane: apply plugin: "java" Chciałbym uchwycić java.

Złożyłem następujące wyrażenie regularne. Kiedy wykonuję poniższy kod (w systemie Linux lub Mac OS), znaleziono dopasowanie, ale właściwość BASH_REMATCH tablica jest pusta (tzn. długość zera).

Czy ktoś wie, co jest nie tak z wyrażeniem regularnym i / lub jego zastosowaniem?

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

Odpowiedzi:

1 dla odpowiedzi № 1

Nie mogę odtworzyć tego w postaci opublikowanej w systemie macOS. Być może masz pułapkę debugowania lub podobny zestaw.

Aby pomóc w debugowaniu, edytuj pytanie, aby uwzględnić:

  1. Kompletny skrypt, który uruchamiasz (tzn. Zawiera wszystko, co się zapełni $line)
  2. Pełne polecenie, którego używasz, aby je uruchomić, i pełne dane wyjściowe
  3. bash xtrace (-x)

Rozszerzyłem twój kod do MCVE, wykorzystując informacje z twoich komentarzy:

$ 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

Następnie uruchomiłem go w ten sposób i uzyskałem oczekiwany wynik:

$ bash myfile
Match count is 2.
java

Oto wynik z informacjami o debugowaniu:

$ 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

Oto informacje o systemie:

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

Mogę dodać odtworzyć te same wyniki, np. dodawanie trap "[[ a =~ b ]]" DEBUG do skryptu. Jeśli robisz coś takiego, pojawi się w -x wydajność.