상상하다:
파일의 날짜 값을 기본적으로 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/'