Сеть venet0 машины OpenVZ внезапно отключилась

Представленный вами "шаблон":

ptn="[0-9]|[0-9][0-9]/[0-9]|[0-9][0-9]/[0-9][0-9]|[0-9][0-9][0-9][0-9]"

Базовый шаблон

Не будет работать с базовым шаблоном, используемым регистром.Базовые шаблоны не допускают | . Также разрешено использование счетчиков {a, b} (называемых "связанными" в регулярном выражении man 7). Чтобы заставить его работать в операторе case , вам нужно явно построить каждый шаблон:

ptn1="[0-9]/[0-9]/[0-9][0-9]"                       # n  / n  / nn
ptn2="[0-9]/[0-9]/[0-9][0-9][0-9][0-9]"             # n  / n  / nnnn
ptn3="[0-9]/[0-9][0-9]/[0-9][0-9]"                  # n  / nn / nn
ptn4="[0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]"        # n  / nn / nnnn
ptn5="[0-9][0-9]/[0-9]/[0-9][0-9]"                  # nn / n  / nn
ptn6="[0-9][0-9]/[0-9]/[0-9][0-9][0-9][0-9]"        # nn / n  / nnnn
ptn7="[0-9][0-9]/[0-9][0-9]/[0-9][0-9]"             # nn / nn / nn
ptn8="[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]"   # nn / nn / nnnn

А затем использовать его как это:

case $dt in 
    $ptn1|$ptn2|$ptn3|$ptn4|$ptn5|$ptn6|$ptn7|$ptn8 )
        echo "$dt : valid pattern" ;;
    *)  
        echo "$dt : invalid" ;;
esac

(shell) Расширенный шаблон.

Некоторые оболочки позволяют использовать расширенные шаблоны.
Вызываемый список шаблонов в ksh и расширенный шаблон (extglob) в bash.

#!/usr/bin/ksh
ptn="{2}({1,2}([0-9])/){2,4}([0-9])" 
while read dt; do
    printf 'line tested %20s ' "$dt"
    [[ $dt == $ptn ]] && echo "valid pattern" ||  echo "invalid"
done <"infile"

Регулярное выражение

Но представленный вами шаблон можно свести к более простому (BRE) регулярному выражению:

([0-9]{1,2}/){2}[0-9]{2,4}

Это:

  • одна или две цифры, за которыми следует / : [0- 9] {1,2} /
  • повторите вышеуказанное дважды: () {2}
  • добавьте от двух до четырех цифр: [0-9] {2,4}

#!/bin/bash
# also works in ksh and zsh.
reg="^([0-9]{1,2}/){2}[0-9]{2,4}$"

while read dt; do
    printf 'line tested %20s ' "$dt"
    [[ $dt =~ $reg ]] && echo "valid pattern" ||  echo "invalid"
done <"infile"

регулярное выражение BRE.

Если вы не можете использовать ksh, bash или zsh, то используйте обратную кавычку для регулярного выражения:

reg="^\([0-9]\{1,2\}/\)\{2\}[0-9]\{2,4\}$"

И используйте expr (например, также можно использовать sed и awk):

reg="^\([0-9]\{1,2\}/\)\{2\}[0-9]\{2,4\}$"

while read dt; do
    printf 'line tested %20s ' "$dt"
    expr "$dt" : "\($reg\)" >/dev/null && echo "valid pattern" ||  echo "invalid"
done <"infile"
1
17.07.2015, 10:11
0 ответов

Теги

Похожие вопросы