0

字幕ファイルを解析しようとしています。そして、サンプル文字列は次のようになります。

00:00:01,000-> 00:00:04,074

私はこの正規表現を持っています:

#!/bin/bash
while read line
do      
    if [[ "$line" =~ ^[0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}* ]]
    then
            echo $line
    fi           
done < $1

この正規表現は機能し、線をエコーし​​ます。しかし、ifステートメントのパターンを次のように拡張すると:

if [[ "$line" =~ ^[0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}*--* ]]

その後、それはもう動作しません。

同様に、この正規表現は機能します:

while read line
do
       if [[ "$line" =~ [0-9]{2}*[0-9]{2}*[0-9]{2}*[0-9]{3}*--\>*[0-9]{2}*[0-9]{2}*[0-9]{2}*[0-9]{3}* ]]
        then
                echo $line
        fi

done < $1

しかし、^(最初の場合のように)パターンの先頭に配置した場合、または:sとsを使用した場合、,それは機能しなくなります。

なぜこんな奇妙な振る舞いをするのかわかりません。誰か助けてもらえますか?

4

1 に答える 1

3

*コマンドラインでのファイルマッチングの場合とはまったく異なります。「任意の文字の0以上」ではなく、「前の文字の0以上」を意味します。.0以上の任意の文字と一致させるには、その前に付ける必要があります(これ.は、任意の文字と一致する正規表現の特殊文字であるためです)。

これはあなたのラインと一致し、おそらくあなたが最終的に望む正規表現です:

if [[ "$line" =~ ^[0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}\ ?--\>\ ?[0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}$ ]];
于 2012-07-14T23:30:06.977 に答える