Как я могу преобразовать формат даты MM-DD-YY HH: MI AM / PM в YYYY-MM-DD в сценариях оболочки - PullRequest
0 голосов
/ 20 февраля 2020

В настоящее время я пытаюсь преобразовать формат даты с помощью приведенной ниже команды

while IFS=$'\t' read -r -a ValArray
do
FILEDATE=${ValArray[0]}
COMPDATE=`date -d  $FILEDATE +'%Y-%m-%d'`

При попытке динамически получить значение из файла и сравнить его с сегодняшней датой

* 1005 я получаю следующую ошибку *

Как мне переопределить это и получить дату в формате ГГГГ-ММ-ДД?

1 Ответ

1 голос
/ 20 февраля 2020

Использование расширений параметров

Оболочка POSIX предоставляет расширения параметров для удаления substring из string, начинающегося слева (спереди) или справа (сзади) строки:

${string#substring}     Strip shortest match of $substring from front of $string
${string##substring}    Strip longest match of $substring from front of $string
${string%substring}     Strip shortest match of $substring from back of $string
${string%%substring}    Strip longest match of $substring from back of $string

Подстрока может содержать обычное глобирование файла, например, '*', '?', et c.

В вашем случае (с f='02-11-20 2:25 AM') вы можете удалить различные подстроки слева и справа, чтобы получить месяц, день и год. Затем вы можете умножить 2-ди git год на 100, чтобы получить 4-ди git год следующим образом:

f='02-11-20 2:25 AM'
f="${f% *}"     # trim AM (to first space) from right (back)
f="${f% *}"     # trim 2:25 (to first space) from right
m="${f%%-*}"    # trim to last - from right leaving month
y="${f##*-}"    # trim to last - from left (front) leaving year
d="${f#*-}"     # trim to first - from left leaving day-year
d="${d%-*}"     # trim to first - from right leaving day
y=$((y*100))    # mulitply 2-digit year by 100
printf "%4d-%02d-%02d\n" "$y" "$m" "$d"     # output in desired format

Используя expr substr string start length

POSIX также предоставляет старый набор expr .... функций для работы со строками, хотя, поскольку заменяет команду , это, вероятно, будет медленнее, чем расширения встроенных параметров. Здесь уместно:

expr substr string start length

Извлечь символьную подстроку length из string, начиная с индекса (на основе 1) start. Вы можете получить месяц, день и год, используя:

f='02-11-20 2:25 AM'
m=$(expr substr "$f" 1 2)                   # extract 2-digit substring at 1
d=$(expr substr "$f" 4 2)                   # extract 2-digit substring at 4
y=$(expr substr "$f" 7 2)                   # extract 2-digit substring at 7
y=$((y*100))                                # mulitply 2-digit year by 100
printf "%4d-%02d-%02d\n" "$y" "$m" "$d"     # output in desired format

( примечание: так же, как при использовании [...] всегда заключайте в кавычки ваши переменные при использовании expr ...)

Использование sed

Вы также можете использовать замену basi c sed с тремя группами захвата и тремя обратными ссылками для повторной вставки компонентов даты в правильном порядке. Группы захвата \(text\) захватывают текст между ними (представленный регулярным выражением text), и в замещающей части выражения захваченный текст может быть повторно вставлен с использованием нумерованной обратной ссылки \1 для первый захват, \2 для второго и т. д., например:

f='02-11-20 2:25 AM'
echo "$f" | sed 's/^\(..\)-\(..\)-\(..\).*$/\300-\1-\2/'

Пример вывода

Оба подхода дают одинаковый вывод:

2000-02-11

Дайте мне знать, если у вас есть дополнительные вопросы.

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