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ď č. 1Má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