Представленный вами "шаблон":
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
Некоторые оболочки позволяют использовать расширенные шаблоны.
Вызываемый список шаблонов в 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} / #!/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"
Если вы не можете использовать 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"