123

bash を使用して文字列から時間を抽出しようとしていますが、それを理解するのに苦労しています。

私の文字列は次のようなものです:

US/Central - 10:26 PM (CST)

そして、その部分を抽出したい10:26

sed、awkなどを使用せずに、bashのみでこれを行う方法を知っている人はいますか?

同様に、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

クイックアンドダーティ、正規表現フリー、ロバスト性の低いチョップチョップ手法

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

foo="米国/中部 - 午後 10 時 26 分 (CST)"

エコー ${foo} | 日付 +%H:%M

于 2021-07-19T15:04:48.983 に答える