Как преобразовать ГГГГММДДЧЧММСС в дату, читаемую по дате - PullRequest
2 голосов
/ 16 ноября 2010

У меня есть набор строк даты / времени в формате ГГГГММДДЧЧММСС, которые я хочу преобразовать во что-нибудь читаемое утилитой date.Обычно я могу сделать что-то вроде:

date -d "2010-10-01 12:34:56"

Однако date не нравится YYYYMMDDHHMMSS:

date -d "20100101123456" .. недопустимая дата

Итак, мне, вероятно, нужно уточнить строку в прежнем формате.Я думаю, что sed - это ответ, но он становится очень уродливым.Я совершенно уверен, что мои строки будут в правильном формате, так как мне легко конвертировать их?

Ответы [ 6 ]

8 голосов
/ 16 ноября 2010

дата не допускает «ГГГГММДДЧЧММСС», но имеет значение «ГГГГММДД ЧЧ: ММ: СС», поэтому:

D="20100101123456"
date -d "${D:0:8} ${D:8:2}:${D:10:2}:${D:12:2}"
4 голосов
/ 16 ноября 2010

Если формат полностью фиксированный, вы можете просто сделать это в bash, порезав строку:

d=20100101123456
pretty_date="${d:0:4}-${d:4:2}-${d:6:2} ${d:8:2}:${d:10:2}:${d:12:2}"
# 2010-01-01 12:34:56
...

Я бы не стал пытаться использовать регулярные выражения - как вы сказали, шаблон становится ужаснымбыстро.Много повторений ([0-9]{4}), даже с расширенным или регулярным выражением perl.Или вы можете быть гибкими и просто соответствовать .;без проверки.

2 голосов
/ 16 ноября 2010

Попробуйте это:

echo "20101106213245" | sed -r 's/^.{8}/& /;:a; s/([ :])(..)\B/\1\2:/;ta'

Результат:

20101106 21:32:45
  • Вставьте пробел после восьмого символа
  • [label a] После пробела илидвоеточие и следующие два символа, добавьте двоеточие
  • Если была произведена замена, перейдите к метке a

Вам тоже нужны дефисы?

echo "20101106213245" | sed -r 's/^.{4}/&-/;:a; s/([-:])(..)\B/\1\2:/;ta;s/:/-/;s/:/ /'

Результат:

2010-11-06 21:32:45
  • Вставьте дефис после четвертого символа
  • [label a] После дефиса или двоеточия и следующих двух символов добавьте двоеточие
  • Если была произведена замена, перейдите к метке a
  • Измените первое двоеточие на дефис (2010-11:06:21:32:45 -> 2010-11-06:21:32:45)
  • Измените следующее двоеточие на пробел (2010-11-06:21:32:45-> 2010-11-06 21:32:45)
1 голос
/ 16 ноября 2010

Что за ответы на все эти регулярные выражения?Инструмент date (1) имеет возможность использовать форматирование даты в стиле strftime () ... пример преобразования одного типа даты в другой:

$ date -j -f "%Y%m%d%H%M%S" "20100101123456" "+%Y-%m-%d %H:%M:%S"
2010-01-01 12:34:56

Так что, если он не в нужном форматепреобразовать это так и затем использовать это.Если вы просто хотите установить его, вы можете просто сделать:

$ date -f "%Y%m%d%H%M%S" "20100101123456"
0 голосов
/ 11 октября 2016

Дата занятости или дата BSD принимают описание формата ввода.

Busybox - это небольшая утилита GNU, простая в установке.

Формат bsd был описан в другом ответе, так что здесь он занят:

$ busybox date -D "%Y%m%d%H%M%S" -d "20100101123456" +'%Y-%m-%d %H:%M:%S'
2010-01-01 12:34:56
0 голосов
/ 16 ноября 2010
 sed -ne 's/\(....\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1-\2-\3 \4:\5:\6/p'

Я признаю, что это полный рот.Все. Оптимально должны быть [0-9] или \ d, хотя я не помню, поддерживает ли sed последнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...