Как перевести отформатированное время в миллисекунды?

Суть проблемы:
Надо написать скрипт на баше, который бы переводил отформатированную дату в миллисекунды.
Входная строка следующая:
1 d 11 h 12 m 23 s

В принципе, как переводить я нашел, но есть трудность с парсингом строки.
Думаю, что алгоритм следующий:
1) убрать пробелы между 1 и d, 11 и h и т.д. чтобы на выходе получилось 1d 11h 12m 23s
2) разделить строку по словам и запихнуть в разные переменные или в массив
3) преобразовать каждую составляющую в миллисекунды
4) все сложить и радоваться)

Сейчас у меня проблемы с 1-м пунктом и 2-м.
  • Вопрос задан
  • 142 просмотра
Решения вопроса 1
@Drill
Можно так:

#!/bin/bash

###
# ./str2msec.sh "1 d 11 h 12 m 23 s"
# 
# или так
# 
# echo "1 d 11 h 12 m 23 s" | xargs -0 ./str2msec.sh
###

argument="$1"
# Варианты аргументов:
#argument="1 d 11 h 12 m 23 s"
# or
#argument="1 d   12 m 23 s"
# or
#argument=" 11 h 23 s"
# or
#argument="11   hm 23"


## Убираем пробелы

data=${argument// /}
# Результат из примеров выше:
#data="1d11h12m23s"
# or
#data="1d12m23s"
# or
#data="11h23s"
# or
#data="11hm23"
echo
echo "data = $data"
echo

## Регуляркой делим на элементы
re='([0-9]+[d])?([0-9]+[h])?([0-9]+[m])?([0-9]+[s])?'

## Ищем совпадения и вычисляем
if [[ ${data} =~ ${re} ]]; then
    echo "BASH_REMATCH  = ${BASH_REMATCH}"
    echo "BASH_REMATCH1 = ${BASH_REMATCH[1]}"
    echo "BASH_REMATCH2 = ${BASH_REMATCH[2]}"
    echo "BASH_REMATCH3 = ${BASH_REMATCH[3]}"
    echo "BASH_REMATCH4 = ${BASH_REMATCH[4]}"

    days=$(( $((${BASH_REMATCH[1]%d})) * 24 * 60 * 60 * 1000 ))
    hours=$(( $((${BASH_REMATCH[2]%h})) * 60 * 60 * 1000 ))
    minutes=$(( $((${BASH_REMATCH[3]%m})) * 60 * 1000 ))
    seconds=$(( $((${BASH_REMATCH[4]%s})) * 1000 ))
    result=$(( ${days} + ${hours} + ${minutes} + ${seconds} ))
else
    echo "not matched"
    exit 1
fi

echo
echo "Result = $result msec"
echo
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@notwrite
Именно скрипт на баше? может date хватит?
Ответ написан
alexgearbox
@alexgearbox
1) Убирать нужно все пробелы: 1d11h12m23s
2) Выражением (\d+[d|h|m|s]) полученное «слово» разделить на элементы. (Например, в текстовом редакторе вывести каждую часть «слова» на новую строку: \1\n)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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