123

我正在尝试使用 bash 从字符串中提取时间,但我很难弄清楚。

我的字符串是这样的:

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

4

5 回答 5

252

使用纯

$ 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}}}'
于 2012-11-14T04:54:29.163 回答
133
    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
于 2016-04-22T16:14:58.337 回答
31

Quick 'n dirty、无正则表达式、低鲁棒性的斩波技术

string="US/Central - 10:26 PM (CST)"
etime="${string% [AP]M*}"
etime="${etime#* - }"
于 2012-11-14T08:01:57.810 回答
6

如果你的字符串是

foo="US/Central - 10:26 PM (CST)"

然后

echo "${foo}" | cut -d ' ' -f3

将完成这项工作。

于 2019-03-26T19:06:17.957 回答
-1

foo="美国/中部 - 晚上 10:26 (CST)"

回声 ${foo} | 日期 +%H:%M

于 2021-07-19T15:04:48.983 回答