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 回答