UNIX -грэп 2-й символ

Итак, вот пример строки в моем скрипте:

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

, например, пользовательский ввод 1315, как я получаю grep 3-го и 4-го разряда (15), и тогда результат должен быть похож на это

Your time is 13 hours and 15 minutes
-1
задан 9 May 2016 в 10:17

3 ответа

Необходимо сделать это использование всего bash, с помощью 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

Или строковое разрезание (Благодарен за то, что @Serg упоминает), обратите внимание, что индекс запускается в 0:

формат:

${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

, Если Вы настаиваете 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
0
ответ дан 9 May 2016 в 20:17
  • 1
    Потрясающий! Более Хороший, чем modprobe решение IMO начиная с того также требует добавления команд modprobe в резюме в пополудни-utils. – Chester 14 October 2018 в 13:05

Используйте cut:

echo asdf | cut -c 3-4

Возвраты df,

[еще 119] использование:

echo asdfghi | cut 3-

Возвраты dfghi, работы то же другой путь (-5 все до 5 символов).

Для Вашего конкретного случая:

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"

Это будет работать на все допустимые 4 военных исходных данные времени цифры.

0
ответ дан 9 May 2016 в 20:17
  • 1
    То же здесь, с помощью Ubuntu 19.10 на Lenovo ThinkPad T440s. Как упомянуто в LP № 1722478 , это поведение является частью ошибки и не предназначенное. – tanius 11 April 2019 в 07:01

Используя расширение параметра:

$ 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

Или можно использовать Python, чтобы сделать задание:

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

Или 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

grep является инструментом соответствия строки, таким образом, это не является лучшим для этой задачи, но он может соответствовать 2 символам за один раз, таким образом вот метод, но я не рекомендую это:

$ 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
0
ответ дан 9 May 2016 в 20:17
  • 1
    Я имею ту же проблему и попробовал большинство решений, которые Вы перечислили в своем первом сообщении без успеха. Какой профиль Вы удаляли, чтобы заставить его работать? – Olivier Boudry 31 December 2017 в 06:02

Другие вопросы по тегам:

Похожие вопросы: