O "padrão" que você apresenta:
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]"
Padrão básico
Não funcionará em um padrão básico usado por maiúsculas e minúsculas. Padrões básicos não permitem |
. Nem permitir o uso de contagens {a,b}
(chamado "ligado" no homem 7 regex). Para fazê-lo funcionar em uma instrução case
, você precisa criar explicitamente cada padrão:
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
E, em seguida, use-o como este:
case $dt in
$ptn1|$ptn2|$ptn3|$ptn4|$ptn5|$ptn6|$ptn7|$ptn8 )
echo "$dt : valid pattern" ;;
*)
echo "$dt : invalid" ;;
esac
(shell) Padrão estendido.
Algumas camadas permitem o uso de padrões estendidos.
Chamada pattern-list em ksh e Extended pattern (extglob) no 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"
Regex
Mas o padrão apresentado pode ser reduzido a esse regex mais simples (BRE):
([0-9]{1,2}/){2}[0-9]{2,4}
Qual é:
- um ou dois dígitos seguido por um
/
: [0-9] {1,2} /
- repita o acima duas vezes: () {2}
- acrescente de dois a quatro dígitos: [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 regex.
Se você não pode usar ksh, bash ou zsh, então backquote o regex:
reg="^\([0-9]\{1,2\}/\)\{2\}[0-9]\{2,4\}$"
E use expr
(por exemplo, sed e awk também podem ser usados):
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"