在纯bash中使用regexp提取子string

我试图用bash从string中提取时间,而且我很难搞清楚。

我的string是这样的:

US/Central - 10:26 PM (CST) 

我想提取10:26部分。

任何人都知道只有用bash才能做到这一点 – 不使用sed,awk等?

就像在PHP中,我会使用 – 不是最好的方式,但它的作品 – 如:

 preg_match( ""(\d{2}\:\d{2}) PM \(CST\)"", "US/Central - 10:26 PM (CST)", $matches ); 

感谢您的帮助,即使答案使用sed或awk

使用纯粹的bash :

 $ cat file.txt US/Central - 10:26 PM (CST) $ while read ab time x; do [[ $b == - ]] && echo $time; done < file.txt 

另一个解决scheme与bash正则expression式:

 $ [[ "US/Central - 10:26 PM (CST)" =~ -[[:space:]]*([0-9]{2}:[0-9]{2}) ]] && echo ${BASH_REMATCH[1]} 

另一个使用grep和look-around高级正则expression式的解决scheme:

 echo "US/Central - 10:26 PM (CST)" | grep -oP "\-\s+\K\d{2}:\d{2}" 

另一个解决scheme使用sed:

 $ echo "US/Central - 10:26 PM (CST)" | sed 's/.*\- *\([0-9]\{2\}:[0-9]\{2\}\).*/\1/' 

另一个解决scheme使用Perl:

 $ echo "US/Central - 10:26 PM (CST)" | perl -lne 'print $& if /\-\s+\K\d{2}:\d{2}/' 

最后一个使用awk:

 $ echo "US/Central - 10:26 PM (CST)" | awk '{for (i=0; i<=NF; i++){if ($i == "-"){print $(i+1);exit}}}' 
  echo "US/Central - 10:26 PM (CST)" | sed -n "s/^.*-\s*\(\S*\).*$/\1/p" -n suppress printing s substitute ^.* anything at the beginning - up until the dash \s* any space characters (any whitespace character) \( start capture group \S* any non-space characters \) end capture group .*$ anything at the end \1 substitute 1st capture group for everything on line p print it 

快速的肮脏,无正则expression式,低坚固性斩技术

 string="US/Central - 10:26 PM (CST)" etime="${string% [AP]M*}" etime="${etime#* - }"