Shell

Unix 案例正則表達式

  • September 18, 2016

我正在嘗試使用case命令匹配日期模式,但它不起作用。有人能幫我嗎 ?

輸入01/05/19005/6/1900

使用的案例陳述:

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]"

case "$dt" in 
   $ptn ) echo "valid pattern" ;;
   *) echo "invalid"
esac

但是 case 語句中使用的模式並未評估上述 2 個日期輸入。

試試這個。 case只了解 glob,因此處理正則表達式並不簡單。不過,=~運營商在這裡提供了一些解決方案。

#!/bin/bash
INP="01/05/1900"
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])$"
if [[ $INP =~ $ptn ]] ; then
   echo valid pattern
else
   echo invalid
fi

如果您想減小正則表達式的大小,^[0-9]{1,2}/[0-9]{1,2}/([0-9]{2}|[0-9]{4})$也同樣有效。

正如@Steve 已經提到的,case需要一個 glob,而不是正則表達式。你仍然可以使用case,你只需要給它 glob 代替:

#!/bin/sh
dt="$1";
ptn1="[0-9]/[0-9]/[0-9][0-9][0-9][0-9]"           ## N/N/NNNN
ptn2="[0-9][0-9]/[0-9]/[0-9][0-9][0-9][0-9]"      ## NN/N/NNNN
ptn3="[0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]"      ## N/NN/NNNN
ptn4="[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9]" ## NN/NN/NNNN

case "$dt" in 
   $ptn1|$pt2|$pt3|$pt4 ) echo "$dt : valid pattern" ;;
   *) echo "$dt : invalid" ;;
esac

然後,像這樣執行腳本:

foo.sh 15/6/1900

例如:

$ for i in 05/6/1900 5/06/1900 05/06/1900 05/06/19 123/123/123; do foo.sh $i; done
05/6/1900 : valid pattern
5/06/1900 : valid pattern
05/06/1900 : valid pattern
05/06/19 : invalid
123/123/123 : invalid

如果您可以訪問 GNU 工具(特別是 GNU date),您還可以使用以下技巧:

#!/bin/sh
dt="$1";
date -d $dt &> /dev/null &&
       echo "$dt : Valid pattern" ||
               echo "$dt :Invalid pattern"

然後,在與以前相同的測試輸入上:

$ for i in 05/6/1900 5/06/1900 05/06/1900 05/06/19 123/123/123; do foo.sh $i; done
05/6/1900 : Valid pattern
5/06/1900 : Valid pattern
05/06/1900 : Valid pattern
05/06/19 : Valid pattern
123/123/123 :Invalid pattern

如您所見,即使在例如年份被指定為YY而不是YYYY.

引用自:https://unix.stackexchange.com/questions/310649