Регулярное выражение в KornShell - PullRequest
10 голосов
/ 23 января 2010

Я пытаюсь проверить, является ли переменная ровно двумя числами, но я не могу понять это.

Как вы проверяете регулярные выражения (регулярные выражения) в KornShell (ksh)?

Я пробовал:

if [[ $month =~ "[0-9]{2}" ]]
if [[ $month = _[0-9]{2}_ ]]

Мне не удалось найти на нем никаких документов.

Есть идеи?

Ответы [ 5 ]

8 голосов
/ 02 апреля 2011

Ksh поддерживает ограниченные расширенные шаблоны начиная с ksh88, используя синтаксис

special '(' pattern ')'

.

В ksh88 префиксы специальных символов изменяют количество ожидаемых совпадений:

'*' for zero or more matches
'+' at least one match
'@' for exactly one match
'?' for zero or one matches
'!' for negation

В ksh93 это было расширено с помощью

'{' min ',' max '}'

, чтобы выразить точный диапазон:

for w in 1423 12 "" abc 23423 9 33 3  333
do
  [[ $w == {1,3}(\d) ]] && print $w has between 1 and three digits
  [[ $w == {2}(\d) ]] && print $w has exactly two digits
done

И, наконец, вы можете иметь подобный perl беспорядок с помощью '~', который вводит целый новый класс расширений, включая полные регулярные выражения с:

' ~ (E) (regex) '

Дополнительные примеры можно найти в Finnbarr P.Блог Мерфи

8 голосов
/ 23 января 2010
case $month in
    [0-9][0-9]) echo "ok";;
    *) echo "no";;
esac

должно работать.

Если вам нужен полный поиск по регулярному выражению, вы можете использовать egrep, например:

if echo $month | egrep -q '^[0-9]{2}$'
then
    echo "ok"
else
    echo "no"
fi
5 голосов
/ 23 января 2010

Откуда я, это, скорее всего, для проверки числовых месяцев:

if (( $month >= 1 && $month <= 12 ))

или

[[ $month =~ ^([1-9]|1[012])$ ]]

или включить ведущий ноль для однозначных месяцев:

[[ $month =~ ^(0[1-9]|1[012])$ ]]
3 голосов
/ 23 января 2010

ksh не использует регулярные выражения; он использует более простой, но все же довольно полезный язык, называемый «шаблонами оболочки». Ключевые идеи

  • Классы типа [0-9] или [chly] соответствуют любому символу в классе.
  • . не является специальным символом; это соответствует только ..
  • ? соответствует любому отдельному символу.
  • * соответствует любой последовательности символов.
  • В отличие от регулярных выражений, шаблоны сглаживания оболочки должны соответствовать всему слову, поэтому оно работает так, как если бы это было регулярное выражение, которое всегда начиналось бы с ^ и заканчивалось $.

Шаблоны сгущения не такие мощные, как регулярные выражения, но их гораздо проще читать, и они очень удобны для сопоставления имен файлов и простых слов. Конструкция case - моя любимая для сопоставления, но есть и другие.

Как уже заметил Алок, вы, вероятно, хотите

case $number in
  [0-9][0-9]) success ;;
  *) failure;;
esac

Хотя, возможно, вы предпочитаете не сопоставлять двузначное число с начальным нулем, поэтому предпочитайте [1-9][0-9].

0 голосов
/ 23 января 2010

Вы также можете попробовать это

$ month=100
$ [[ $month == {1,2}([0-9]) ]] && echo "ok" || echo "no"
no
$ [[ $month == [0-9][0-9] ]] && echo "ok" || echo "no"
no
$ month=10
$ [[ $month == {1,2}([0-9]) ]] && echo "ok" || echo "no"
ok
$ [[ $month == [0-9][0-9] ]] && echo "ok" || echo "no"
ok
...