Answers:
使用纯 重击 :
$ cat file.txt
US/Central - 10:26 PM (CST)
$ while read a b time x; do [[ $b == - ]] && echo $time; done < file.txt
bash regex的另一个解决方案:
$ [[ "US/Central - 10:26 PM (CST)" =~ -[[:space:]]*([0-9]{2}:[0-9]{2}) ]] &&
echo ${BASH_REMATCH[1]}
使用grep
和环视高级正则表达式的另一种解决方案:
$ echo "US/Central - 10:26 PM (CST)" | grep -oP "\-\s+\K\d{2}:\d{2}"
使用sed的另一种解决方案:
$ echo "US/Central - 10:26 PM (CST)" |
sed 's/.*\- *\([0-9]\{2\}:[0-9]\{2\}\).*/\1/'
使用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}}}'
sed
版本,但想警告其他sed
未必带有+
修饰符的人。解决方法之一是使用{1, }
修饰符来匹配一个或多个。
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
-n
然后再请求打印/p
吗?省略-n
标志和省略/p
指令不是一样吗?谢谢。
快速'n脏,无正则表达式,低健壮的印章技巧
string="US/Central - 10:26 PM (CST)"
etime="${string% [AP]M*}"
etime="${etime#* - }"
| read zone dash time apm zone
起作用
如果你的字符串是
foo="US/Central - 10:26 PM (CST)"
然后
echo "${foo}" | cut -d ' ' -f3
会做的工作。
cut -c14-18
当然只要字符位置没有变化即可。如果时区固定,则不应发生这种情况。