0

フォームの日付に一致する正規表現01/Jan/2000:23:59:59です。次の正規表現を使用して、Notepad ++の正規表現インタープリターを使用してパターンを一致させることができました。

[1-3][0-9]/[A-Z][a-z]{2}/(19|20)[0-9]{2}:[0-9]{2}:[0-5][0-9]:[0-5][0-9]

残念ながら、これは bash で行う必要があります。AWK は今のところオプションではありません。そこで、上記の正規表現を bash が同じように解釈できるものに変換しようとしました。これまでのところ、私はこれを思いつきました:

[1-3][0-9]/[A-Z][a-z]\{2\}/(19|20)[0-9]\{2\}:[0-2][0-9]:[0-5][0-9]:[0-5][0-9]

私が使用している完全なコマンドは

expr "$line" : '\([1-3][0-9]/[A-Z][a-z]\{2\}/(19|20)[0-9]\{2\}:[0-2][0-9]:[0-5][0-9]:[0-5][0-9]\)'

where$lineには、日付を抽出する必要がある文字列が含まれています。残念ながら、正規表現の私の bash バージョンは機能しません。エスケープ/や など、さまざまなことを試し:ましたが、うまくいかないようです。私は何を間違っていますか?

4

1 に答える 1

1

唯一の問題は、最初のパターン [1-3] でした。[0-3] である必要があります。

[[ $DATE =~ [0-3][0-9]/[A-Z][a-z]{2}/(19|20)[0-9]{2}:[0-9]{2}:[0-5][0-9]:[0-5][0-9] ]]

また、以前のバージョンの Bash では、変数に格納する必要があります。

RE='[0-3][0-9]/[A-Z][a-z]{2}/(19|20)[0-9]{2}:[0-9]{2}:[0-5][0-9]:[0-5][0-9]'
[[ $DATE =~ $RE ]]

例:

> DATE='01/Jan/2000:23:59:59'
> [[ $DATE =~ [0-3][0-9]/[A-Z][a-z]{2}/(19|20)[0-9]{2}:[0-9]{2}:[0-5][0-9]:[0-5][0-9] ]] && echo Match.
Match.

バッシュ 3.0:

> echo "$BASH_VERSION"
3.00.0(1)-release
> DATE='01/Jan/2000:23:59:59'
> RE='[0-3][0-9]/[A-Z][a-z]{2}/(19|20)[0-9]{2}:[0-9]{2}:[0-5][0-9]:[0-5][0-9]'
> [[ $DATE =~ $RE ]] && echo Match.
Match.

ループに適用したい場合は、次のようにすることができます。

RE='[0-3][0-9]/[A-Z][a-z]{2}/(19|20)[0-9]{2}:[0-9]{2}:[0-5][0-9]:[0-5][0-9]'
while read -r LINE; do
    [[ $LINE =~ $RE ]] && echo "Match: $LINE"
done < date_list.txt

ところで、単語全体を正確に一致させたい場合は、パターンの最初と最後にadd ^andのみを使用します。$

[[ $DATE =~ ^[0-3][0-9]/[A-Z][a-z]{2}/(19|20)[0-9]{2}:[0-9]{2}:[0-5][0-9]:[0-5][0-9]$ ]]

行で一致を抽出するには、 and を使用()BASH_REMATCHます。

[[ $DATE =~ .*([0-3][0-9]/[A-Z][a-z]{2}/(19|20)[0-9]{2}:[0-9]{2}:[0-5][0-9]:[0-5][0-9]).* ]] && echo "${BASH_REMATCH[1]}"
于 2013-09-10T09:45:08.203 に答える