UNIX -grep Segundo caractere

-1

Então aqui está uma linha de amostra no meu script:

echo "Enter time(MILITARY FORMAT)(i.e 1245): "
read time'

assim, por exemplo, a entrada do usuário é 1315 Como faço para grep o terceiro e quarto dígito (15) e, em seguida, a saída deve ser assim

Your time is 13 hours and 15 minutes
    
por EmberSpirit 09.05.2016 / 08:41

3 respostas

2

Você deve fazer isso usando apenas bash , usando a expansão do parâmetro bash :

$ time=1315

$ hr="${time%??}"  ## getting first two characters

$ min="${time#??}"  ## getting last two characters

$ echo "Your time is "$hr" hours and "$min" minutes"
Your time is 13 hours and 15 minutes

Ou corte de string (obrigado @Serg por mencionar), observe que o índice começa em 0:

O formato é:

${parameter:offset:length}


$ time=1315

$ hr="${time:0:2}"  ## getting chars at index 0 and index 1

$ min="${time:2:2}"  ## getting chars at index 2 and 3

$ echo "Your time is "$hr" hours and "$min" minutes"
Your time is 13 hours and 15 minutes

Se você insistir em grep :

$ time=1315

$ hr="$(grep -o '^..' <<<"$time")"  ## getting first two characters

$ min="$(grep -o '..$' <<<"$time")"  ## getting last two characters

$ echo "Your time is "$hr" hours and "$min" minutes"
Your time is 13 hours and 15 minutes
    
por heemayl 09.05.2016 / 08:50
1

Use cut :

echo asdf | cut -c 3-4

Retorna df ,

Mais usos:

echo asdfghi | cut 3-

Retorna dfghi , funciona da mesma maneira ( -5 é tudo até 5 caracteres).

Para o seu caso específico:

printf "Enter time(MILITARY FORMAT)(i.e 1245): "
read time
hours="'echo $time | cut -c 1-2'"
minutes="'echo $time | cut -c 3-4'"
echo "Your time is "$hours" hours and "$minutes" minutes"

Isso funcionará para todas as entradas válidas de tempo militar de 4 dígitos.

    
por Zzzach... 09.05.2016 / 08:47
0

Usando a expansão de parâmetros:

$ printf "Enter time in military format(HHMM):" && read TIME                                                              
Enter time in military format(HHMM):1512

$ echo your time is "${TIME:0:2}" hours and  "${TIME:2:2}"                                                                    
your time is 15 hours and 12

Ou você pode usar o python para fazer o trabalho:

$ python -c "time=str(${TIME}); print 'your time is',time[:2], 'hours and ',time[2:],'minutes'"                           
your time is 15 hours and  12 minutes

Ou AWK:

$ awk -v time=${TIME} 'BEGIN{print "Your time is ",substr(time,1,2)," hours and ",substr(time,3),"minutes"}'              
Your time is  15  hours and  12 minutes

O grep é uma ferramenta de correspondência de linhas, por isso não é o melhor para esta tarefa, mas pode corresponder a 2 caracteres de cada vez, portanto, aqui está um método, mas eu não o recomendo:

$ array=( $(grep -o -E '.{0,2}' <<< "${TIME}") )                                                                          

$ echo ${array[1]}
12

$ echo Your time is ${array[0]} hours  ${array[1]} minutes                                                                
Your time is 15 hours 12 minutes
    
por Sergiy Kolodyazhnyy 09.05.2016 / 09:17