2012-07-14 85 views
0

我想解析一个字幕文件。和样本串的样子:Bash正则表达式匹配冒号分隔的整数

00:00:01000 - > 00:00:04074

我有这样的正则表达式:

#!/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和,的IT没有按”再工作。

我不明白为什么会出现这种奇怪的行为。谁能帮忙?

回答

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}$ ]]; 
+0

谢谢!你能告诉我为什么在最后? – gaganbm 2012-07-14 23:39:37

+0

在开始时'^'的意思是“只在字符串的开头匹配”,'$'只匹配字符串的末尾。所以,如果你同时使用它们,那么你的正则表达式必须匹配整个字符串。 – Trott 2012-07-14 23:40:35

+0

谢谢。为我工作。 :-) – gaganbm 2012-07-14 23:42:05