/ / Zhody skupín v bash regex [duplicate] - regex, bash

Zhody skupín v bash regex [duplicate] - regex, bash

V bash mám nasledujúce:

REGEX="(1.0.0|2.0.0)"
declare -a arr=("A:1.0.0" "B:1.0.0" "C:2.0.0" "D:2.0.1")
for i in "${arr[@]}"
do
echo "Found: $i"
if [[ "$i"=~"${REGEX}" ]]; then
echo "$i matches: ${REGEX}"
else
echo "$i DOES NOT match: ${REGEX}"
fi
done

Ja by som to predpokladal D:2.0.1 bude to tlačiť ...DOES NOT match... ale namiesto toho vytlačí

Found: A:1.0.0
A:1.0.0 matches: (1.0.0|2.0.0)
Found: B:1.0.0
B:1.0.0 matches: (1.0.0|2.0.0)
Found: C:2.0.0
C:2.0.0 matches: (1.0.0|2.0.0)
Found: D:2.0.1
D:2.0.1 matches: (1.0.0|2.0.0)

Takže čo sa deje s mojím modelom skupiny REGEX? Určenie skupinového vzoru, ktorý funguje správne v iných jazykoch - napr. ako groovy.

odpovede:

5 pre odpoveď č. 1

Máte prekreslenie vo výraze výrazu regex, aby ste mohli začať

if [[ "$i"=~"${REGEX}" ]]; then

mala byť napísaná ako spravodlivá

if [[ $i =~ ${REGEX} ]]; then

čo má za následok bod, ktorý by ste mali nikdy uveďte svoje výrazy regexu. Aby pochopil | operátor vo svojej rozšírenej regulárnej výrazovej podpore (ERE) musíte pochopiť, že to nie je doslovný reťazec, s ktorým sa zaobchádza tak, keď je pod dvojitými úvodzovkami.


Neodporúčané

Ak však stále chcete citovať reťazce regexu - bash 3.2 zaviedla možnosť kompatibility compat31 (v časti Nové funkcie v Bash 1.l) ktorý vráti bash regulárny výraz citovať správanie späť na 3.1, ktorý podporoval citovanie reťazca regex. Potrebujete ju povoliť len pomocou rozšírenej možnosti shellu

shopt -s compat31

a spustite ju s úvodzovkami

if [[ $i =~ "${REGEX}" ]]; then