Разобрать дату и время из строки в bash - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть строковая переменная, подобная следующей:

./file_timestamp_2020_02_11_09_00_19

Я хотел бы извлечь datetime из этой строки и установить ее как переменную в следующем формате:

2020-02-11T09:00:19

Я безуспешно пробовал следующее:

filename=$"./file_timestamp_2020_02_11_09_00_19"
output=$($filename | grep -Eo '[[:digit:]]{4}_[[:digit:]]{2}_[[:digit:]]{2}_[[:digit:]]{2}_[[:digit:]]{2}_[[:digit:]]{2}')
datetime=$($output +%Y_%m_%d_%H_%M_%S)

Я получаю следующую ошибку:

-bash: syntax error near unexpected token `$filename'

Как лучше всего это сделать?

Ответы [ 4 ]

0 голосов
/ 12 февраля 2020

Проверено на да sh, sh, к sh, sh, zsh и, конечно, bash, я знаю, не так красиво ...

var=./file_timestamp_2020_02_11_09_00_19 
echo "$var" | { IFS=_ read -r _ _ var3 var4 var5 var6 var7 var8 ; echo "$var3-${var4}-${var5}T${var6}:${var7}:$var8"; }

output

2020-02-11T09:00:19

или bash только с использованием опции -a чтения, массивов и bash спецификаций c PE

echo "$var" | { while IFS=_ read  -ra  var; do echo "${var[@]:2:1}-${var[@]:3:1}-${var[@]:4:1}T${var[@]:5:1}:${var[@]:6:1}:${var[@]:(-1)}"; done; }
0 голосов
/ 12 февраля 2020

Если файл заканчивается в указанном вами формате, т.е. ####_##_##_##_##_##, это должно сработать из быстрого теста. Хотя это не очень красиво, это простое решение.

originalString="file_timestamp_2020_02_11_09_00_19"
newString="${originalString:(-19)}"
newString=$( echo "${newString}" | sed 's/_/-/g' )
newString=$( echo "${newString}" | sed 's/-/T/3' )
newString=$( echo "${newString}" | sed 's/-/:/3g' )

Редактировать: Этот сайт имеет хорошую коллекцию методов обработки переменных / строк, кстати!

0 голосов
/ 12 февраля 2020

Это сработало для меня

#!/bin/bash

convert () {
  IFS=_
  echo "$1" | while read -a T; do
    echo "${T[2]}-${T[3]}-${T[4]}T${T[5]}:${T[6]}:${T[7]}"
  done
}

converted=$(convert "./file_timestamp_2020_02_11_09_00_19")

echo $converted
0 голосов
/ 12 февраля 2020

Вы можете использовать следующую команду GNU sed:

 sed -E 's/.*([0-9]{4})_([0-9]{2})_([0-9]{2})_([0-9]{2})_([0-9]{2})_([0-9]{2}).*/\1-\2-\3T\4:\5:\6/'

Попробуйте здесь .

...