Извлечь подстроку с использованием регулярного выражения в обычном bash
Я пытаюсь извлечь время из строки с помощью 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
Ответы
Ответ 1
Использование чистого bash:
$ 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
и расширенного регулярного выражения look-around:
$ 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}}}'
Ответ 2
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
Ответ 3
Quick 'n грязная, без регулярного выражения, техника с низкой степенью удобочитаемости
string="US/Central - 10:26 PM (CST)"
etime="${string% [AP]M*}"
etime="${etime#* - }"