Простые вопросы Bash и RegEx - PullRequest
       33

Простые вопросы Bash и RegEx

8 голосов
/ 16 сентября 2011

Я не могу получить шаблон для правильного соответствия с помощью регулярных выражений в bash 4.1.Я прочитал некоторую информацию о различиях в кавычках и не в кавычках, но я не думаю, что это моя проблема.

Моя цель - проверить и убедиться, что в скрипте указан правильный идентификатор.Действительный идентификатор в этом случае представляет собой строку из 9 цифр.Я понимаю, что регулярное выражение для этого есть \ d {9}.Учитывая, что вот мой фрагмент кода для проверки:

id=$1       
if [[ $id =~ \d{9} ]]; then
     echo "This is a vaild ID"
else
     echo "This is not a vaild ID"
fi

Затем вызовите скрипт с:

 ./script 987654321

Что-то очевидно, что я пропускаю?

Ответы [ 4 ]

9 голосов
/ 16 сентября 2011

Как уже отвечали другие, вы должны использовать [0-9]{9}, потому что \d не поддерживается. Но еще одна важная часть: Вы должны использовать якоря!

^[0-9]{9}$

^ привязывает регулярное выражение к началу строки, а $ - к концу. Если вы их не используете, ваше регулярное выражение будет соответствовать каждой строке, содержащей 9 цифр в последовательности, например, «abc123456789», «asdf123456789zui» или «123456789FOOBAR».

8 голосов
/ 16 сентября 2011

Это будет работать: если [[$ id = ~ [[: digit:]] {9}]] - Дэвид В. 11 часов назад


@ Дэвид Я попробовал это на bash, но это не сработало. - Вивин Палиат 10 часов назад


Я только что написал тестовую программу:

#! /bin/bash

for id in 123456789 12345689 1234567890 987654321
do
    if [[ $id =~ ^[[:digit:]]{9}$ ]]
    then
        echo "$id is 9 digits long"
    else
        echo "$id is bad"
    fi
done

И я получил следующий вывод:

DaveBook:~ david$ ./test.sh
123456789 is 9 digits long
12345689 is bad
1234567890 is bad
987654321 is 9 digits long
DaveBook:~ david$ 

Я использую BASH 3.2.48 для Mac OS X и Bash 4.1.10 (4) для Cygwin (Wow, версия Mac , что старая?). Я не проверял это на Linux-коробке.

Какую версию вы используете? Вы удваиваете квадратные скобки вокруг :digit:? Это должно быть [[:digit:]], а не [:digit:].

Я также понял, что мне нужны якоря ^ и $, потому что вы не хотите совпадать с foo123456789bar или 1234567890123456790. Была ли у вас такая проблема?

Дело в том, что [[:digit:]] должно сработать. Я использовал его во многих сценариях оболочки Bash, думая, что он довольно универсален. Однако, если у вас есть оболочка BASH, где она не работает, мне придется прекратить ее использовать.

3 голосов
/ 16 сентября 2011

Попробуйте:

if [[ $id =~ [0-9]{9} ]]; then

Похоже, bash не распознает \d как [0-9].

Bash использует ExtendedДиалект регулярных выражений , который не поддерживает \d.

Согласно грамматике ERE (лексические соглашения) экранированные символы имеют форму \SPEC_CHAR.SPEC_CHAR может быть любым из следующих:

^    .    [    $    (    )    |
*    +    ?    {    \
0 голосов
/ 16 сентября 2011

Проблема в том, что \ d превращается в d, прежде чем он будет интерпретирован.Попробуйте двойное экранирование.

\d{9} => d{9}
\\d{9} => \d{9}

Кроме того, вы можете поместить его в кавычки

if [[ $id =~ "\d{9}" ]]
...