2010-01-23 5 views
9

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

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

Я попытался:

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

Я не смог найти какие-либо документы на него.

Любое понимание?

ответ

8
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 
+0

При использовании задать расширенное будет работать, это внешняя программа и будет замедлить сценарий много. – user1683793

0

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

$ 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 
5

, откуда я родом, это более вероятно, для проверки числовой месяцев:

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

или

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

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

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

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

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

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

Как уже отмечалось Alok вы, вероятно, хотите

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

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

+2

ksh93 поддерживает как основные, так и расширенные регулярные выражения с использованием оператора привязки = ~ – cdarke

+1

+1 для объяснения ключевых различий между регулярными выражениями и шаблонами; @cdarke: это хорошо знать, но я не могу заставить его поддерживать выражения _interval_, такие как '{2}'; например '[[11 = ~ [0-9] {2}]] && echo YES' вызывает синтаксическую ошибку; '\' -выражение результатов скобок не соответствует; я что-то упустил ('ksh 93u')? – mklement0

7

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-подобный беспорядок с «~», который вводит совершенно новое класс расширений, включая полные регулярные выражения с:

«~ (Е) (регулярное выражение)»

Больше примеров можно найти в Finnbarr P. Murphy's blog

+3

Вам не нужен ~ (E), если вы используете = ~, это значение по умолчанию – cdarke