Захватить группу шаблонов в операторах case в скриптах bash - PullRequest
0 голосов
/ 03 июля 2018

Типичное выражение case в bash может быть:

k=abcdef
case $k in
    "abc"* )
        echo "pattern found"
        ;;
esac

Одна из моих переменных имеет шаблон key=value, и я хочу извлечь из него значение.

k="abc=value1"
case $k in
    "abc="* )
        echo "key abc found";
        # extract "value1"
        ;;
esac

Как извлечь значение из ключа? Как key1=(.*) и получить захваченную группу, сказав $1 или \1.

1 Ответ

0 голосов
/ 03 июля 2018

Вы можете сопоставить подстроку с имеющимся у вас регулярным выражением и получить доступ к Группе 1, используя ${BASH_REMATCH[1]}:

k="abc=value1"
rx='abc=(.*)'
if [[ $k =~ $rx ]]; then
    echo ${BASH_REMATCH[1]};
fi
# => value1

См. онлайн демо

Обратите внимание, что это самый простой способ использовать регулярное выражение, объявив его в отдельной переменной, чтобы код работал, как и ожидалось, во всех версиях Bash, поддерживающих оператор соответствия =~. Начиная с Bash 3.2 , [[ $k =~ "abc=(.*)" ]] подобный код будет вызывать сравнение литеральных строк, а не сравнение регулярных выражений:

ф. Кавычка строкового аргумента в оператор =~ команды [[ теперь вызывает сопоставление строк, как и с другими операторами сопоставления с образцом.

Регулярное выражение имеет смысл, если у вас сложный сценарий. В вашем случае манипуляции со строками подобно , предложенному pynexj , также будут работать:

k="abc=value1"
echo ${k#*=}
# => value1

См. еще одно демо онлайн . Здесь # вызывает удаление подстроки самой короткой подстроки между началом строки и первым символом = (включая его). Смотрите документацию:

Удаление подстроки

${string#substring}

Удаляет самое короткое совпадение $ substring с начала строки $.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...