bash LINUX에서 날짜를 DD-MM-YYYY에서 YYYY-MM-DD 형식으로 변환

bash LINUX에서 날짜를 DD-MM-YYYY에서 YYYY-MM-DD 형식으로 변환

상상하다:

파일의 날짜 값을 기본적으로 DD-MM-YYYY 형식의 변수로 추출하고 있습니다. 시스템 날짜에서 이 날짜를 빼야 합니다. 두 날짜가 모두 DD-MM-YYYY 형식인 경우 빼기 결과가 잘못됩니다. 그래서 Google에서 몇 가지 내용을 읽고 두 날짜를 모두 YYYY-MM-DD 형식으로 지정하기로 결정했습니다. 이렇게 하면 뺄셈 후에 올바른 값이 제공됩니다. 시스템 날짜 형식을 YYYY-MM-DD로 성공적으로 지정했지만 파일에서 얻은 날짜를 YYYY-MM-DD 형식으로 변환하는 데 문제가 있습니다.

다음 솔루션은 한 자리 날짜에 적용됩니다.

$ date -d $(sed "s/-/\//g" <<< '9-2-1832') +%Y-%m-%d
Output : 1832-09-02

하지만 날짜를 다음과 같이 두 자리로 변환하려고 하면 다음과 같습니다.

$ date -d $(sed "s/-/\//g" <<< '19-07-2021') +%Y-%m-%d

나는 출력을 얻는다

Invalid date '19/07/2021'

어디:

19 - is Date of a month
07 - is Month i.e. July in this case.
2021 - is Year

원하는 출력은 ->2021-07-19

저는 날짜 버전이 date (GNU coreutils) 8.22인 RH Linux에서 작업하고 있습니다.

위의 문제에 대한 해결책을 제공하도록 도와주세요.

답변1

귀하의 경우 awk아마도 더 나은 접근 방식이 될 것입니다.

$ awk -F'-' '{printf("%04d-%02d-%02d\n",$3,$2,$1)}' <<< '19-07-2021'
2021-07-19

답변2

date입력 형식을 지정할 수 있는 busybox 로 전환할 수 있습니다 .

$ date=19-7-2021
$ busybox date -D %d-%m-%Y -d "$date" +%F
2021-07-19

019-007-2021(예를 들어, 날짜는 허용되지 않습니다.)

ast-open 구현과 동일합니다 date(RedHat 시스템에서는 즉시 작동할 가능성이 없음).

$ date -p %d-%m-%Y -d "$date" +%F
2021-07-19

GNU 시스템 대신 BSD 시스템을 사용한다면 다음과 같이 하십시오:

$ date -jf %d-%m-%Y -- "$date" +%F
2021-07-19

또는 내장된 날짜 구문 분석 및 형식을 있는 zsh그대로 사용하도록 전환할 수 있습니다 .bash

$ zmodload zsh/datetime
$ strftime -rs t %d-%m-%Y $date && strftime %F $t
2021-07-19

( 는 표준 및 ( ) API strftime에 액세스할 수 있는 내장 함수입니다 .strftime()strptime()-r

또한 적절한 분할 연산자와 a가 있으며 printf어떤 순서로든 인수를 허용할 수 있으며( GNU를 포함하여 %n$...대부분의 구현 printf()에 있는 구문을 사용 printf()하지만 printf내장 bash또는 GNU printf독립 실행형 유틸리티는 아님) 선행 숫자로 인수를 변환하지 않습니다. 0이 있는 경우 기본 8진수로 처리됩니다.

$ printf '%3$04d-%2$02d-%1$01d\n' ${(s[-])date}
2021-07-19

또는 익명 함수를 사용하십시오.

$ (){ printf '%04d-%02d-%02d\n' $3 $2 $1; } ${(s[-])date}
2021-07-19

또는 여기에서는 배열 반전 연산자를 사용합니다.

$ printf '%04d-%02d-%02d\n' ${(s[-]Oa)date}
2021-07-19

답변3

형식이 로 하드코딩된 경우 DD-YY-YYYY전체 표현식을 하드코딩하여 사용할 수도 있습니다.부분 문자열 추출매우 빠르게 재포맷하세요.

#!/bin/bash
dmy=$(date +%d-%m-%Y)
ymd="${dmy: -4}-${dmy:3:2}-${dmy:0:2}"
echo "$dmy -> $ymd"

형식이 다음과 같은 경우 D[D]-M[M]-YYYY사용할 수 있습니다.일반적인 표현약간 느린 재포맷:

#!/bin/bash
dmy="9-2-1932"
if [[ "$dmy" =~ ^([[:digit:]]+)-([[:digit:]]+)-([[:digit:]]+)$ ]] ; then
  ymd="${BASH_REMATCH[3]}-${BASH_REMATCH[2]}-${BASH_REMATCH[1]}"
fi
echo "$dmy -> $ymd"

다음 형식을 좀 더 잘 사용할 수 있습니다printf:

dmy="9-02-2032"
if [[ "$dmy" =~ ^([[:digit:]]+)-([[:digit:]]+)-([[:digit:]]+)$ ]] ; then
  printf -v ymd '%.4d-%.2d-%.2d' \
    "${BASH_REMATCH[3]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[1]}"
fi
echo "$dmy -> $ymd"

이 답변의 이전 버전은 내가 완전히 읽지 않은 것으로 밝혀졌으며 다음 YYYY-MM-DD과 같이 번역되었습니다 DD-MM-YYYY.

#!/bin/bash

ymd=$(date  +%Y-%m-%d)
dmy="${ymd: -2}-${ymd:5:2}-${ymd:0:4}"
echo "$ymd -> $dmy"

답변4

sed만 사용하는 빠르고 간결한 솔루션:

echo 19-07-2021 | sed -E 's/^([0-9]{1,2})-([0-9]{1,2})-([0-9]{4})$/\3-\2-\1/'

관련 정보