Extract substring using regexp in plain bash Extract substring using regexp in plain bash bash bash

Extract substring using regexp in plain bash


Using pure :

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

another solution with bash regex :

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

another solution using grep and look-around advanced regex :

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

another solution using sed :

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

another solution using perl :

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

and last one using 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 printings       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 linep       print it


Quick 'n dirty, regex-free, low-robustness chop-chop technique

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