Подтвердить что ты не робот

Почему BASH_REMATCH не работает для цитируемого регулярного выражения?

Код выглядит следующим образом:

#!/bin/bash
if [[ foobarbletch =~ 'foo(bar)bl(.*)' ]]
 then
     echo "The regex matches!"
     echo $BASH_REMATCH
     echo ${BASH_REMATCH[1]}
     echo ${BASH_REMATCH[2]}
 fi

Когда я пытаюсь запустить его, он ничего не отображает:

bash-3.2$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.
bash-3.2$ /bin/bash test_rematch.bash
bash-3.2$ 

Есть ли у кого-нибудь идеи об этом? Спасибо!

4b9b3361

Ответ 1

В вашем REG bash вы должны удалить кавычки. Вот почему это не работает.

Если у вас есть место, я рекомендую использовать этот способ:

#!/bin/bash
x='foo bar bletch'
if [[ $x =~ foo[[:space:]](bar)[[:space:]]bl(.*) ]]
then
    echo The regex matches!
    echo $BASH_REMATCH      
    echo ${BASH_REMATCH[1]} 
    echo ${BASH_REMATCH[2]} 
fi

Ответ 2

Вы также можете присвоить цитированное регулярное выражение переменной:

#!/bin/bash

x='foobarbletch'

foobar_re='foo(bar)bl(.*)'

if [[ $x =~ $foobar_re ]] ; then
    echo The regex matches!
    echo ${BASH_REMATCH[*]}
    echo ${BASH_REMATCH[1]}
    echo ${BASH_REMATCH[2]}
fi

Это не только поддерживает простое цитирование, но и дает regexp имя, которое может помочь в удобочитаемости.

Ответ 3

Благодаря вашему оператору отладки echo The regex matches! вы должны были заметить, что с BASH_REMATCH нет проблем, так как оператор if оценивается как false.

В bash регулярные выражения, используемые с =~, не сортируются. Если строка справа цитируется, то она рассматривается как строковый литерал.

Если вы хотите включать пробелы в свои регулярные выражения, используйте соответствующие классы символов или избегайте пространства, если вы хотите пробел.