regexbash

Extract substring using regexp in plain bash


I'm trying to extract the time from a string using bash, and I'm having a hard time figuring it out.

My string is like this:

US/Central - 10:26 PM (CST)

And I want to extract the 10:26 part.

Anybody knows of a way of doing this only with bash - without using sed, awk, etc?

Like, in PHP I would use - not the best way, but it works - something like:

preg_match( ""(\d{2}\:\d{2}) PM \(CST\)"", "US/Central - 10:26 PM (CST)", $matches );

Thanks for any help, even if the answer uses sed or awk


Solution

  • Using pure :

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

    with bash regex :

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

    using grep and look-around advanced regex :

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

    using sed :

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

    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}}}'