date
MacOS를 사용하며 형식에 변수가 있습니다.
3.Jan.2023,
12.Nov.2017,
9.Apr.2022,
...
나 좀 바꿔야 해
03.01.2023,
12.11.2017,
09.04.2022,
...
답변1
애플 시스템date
변환의 입력 및 출력 형식을 지정할 수 있습니다.
for inp in "3.Jan.2023" "12.Nov.2017" "9.Apr.2022"; do
date -j -f "%d.%b.%Y" "$inp" "+%d.%m.%Y"
done
~에 따르면strptime()
:
%b
월, 로케일의 월 이름을 사용하여 약어 또는 전체 이름을 지정할 수 있습니다.%d
날짜 [01,31]. 앞에 0이 허용되지만 필수는 아닙니다.%m
월 번호 [01,12]; 앞에 0이 허용되지만 필수는 아닙니다.%Y
세기를 포함한 연도(예: 1988)입니다.
산출:
03.01.2023
12.11.2017
09.04.2022
답변2
awk를 사용하십시오.
$ awk '
BEGIN { FS=OFS="," }
{
split($1,d,".")
$1 = sprintf("%02d.%02d.%04d", d[1], index(" JanFebMarAprMayJunJulAugSepOctNovDec",d[2])/3, d[3])
print
}
' file
03.01.2023,
12.11.2017,
09.04.2022,
앞쪽에 2칸이 있습니다 Jan
.
답변3
awk
다음을 사용하여 한 형식에서 다른 형식으로 변환 할 수 있습니다 .
awk -F. '
BEGIN { m["Jan"]=1; m["Feb"]=2; m["Mar"]=3; m["Dec"]=12 }
{ printf "%02d.%02d.%04d,\n", $1, m[$2], $3 }
' file
모든 달의 패턴을 따르려면 라인 BEGIN
을 완성해야 합니다.
답변4
사용행복하다(이전 Perl_6)
~$ raku -pe 'my %months = [Z=>] <Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec>, 1..12; \
s/ <( (\d**1..2) \. (<alpha>**3) )> \. \d**4 \, /{sprintf q[%02d.%02d], $0, %months{$1}}/;' file
#OR
~$ raku -pe 'my %months = [Z=>] <Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec>, 1..12; \
s[ <( (\d**1..2) \. (<alpha>**3) )> \. \d**4 \, ] = "{sprintf q[%02d.%02d], $0, %months{$1}}";' file
또는:
~$ raku -e 'my %months = [Z=>] <Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec>, 1..12; \
put S/ <( (\d**1..2) \. (<alpha>**3) )> \. \d**4 \, /{sprintf q[%02d.%02d], $0, %months{$1} }/ for lines();' file
#OR
~$ raku -e 'my %months = [Z=>] <Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec>, 1..12; \
put S[ <( (\d**1..2) \. (<alpha>**3) )> \. \d**4 \, ] = "{sprintf q[%02d.%02d], $0, %months{$1} }" for lines();' file
즉, Raku를 사용하여 문자열 월을 대체하고 숫자(정수)로 대체할 수 있습니다. (를 사용하여) 일 수의 형식을 지정할 수도 있습니다 sprintf
. %months
3자리 월 이름을 키로 사용하여 해시를 선언 하고 숫자를 1..12
값으로 할당합니다. 축소 [Z=>]
메타 연산자는 주어진 두 목록에서 연속적인 요소를 가져와서 key => value
. 결과는 say %months.sort(*.value);
다음을 반환합니다.
(Jan => 1 Feb => 2 Mar => 3 Apr => 4 May => 5 Jun => 6 Jul => 7 Aug => 8 Sep => 9 Oct => 10 Nov => 11 Dec => 12)
해시가 있으면 %months
간단히 s///
교체(또는 S///
경우에 따라 교체)됩니다. 처음 두 코드 예제에서는 -pe
autoprint 플래그가 사용되었습니다. 왼쪽 절반의 일치 항목은 s///
모든 요소를 식별하지만 <(
...)>
"캡처 마크"날짜와 문자열 월만 캡처되도록 모든 것을 외부에 배치합니다(날짜는 에 입력하고 $0
월은 에 입력 $1
). 연산자의 오른쪽 절반에서 s///
해시 %months
값은 $1
아래와 같이 변수 key에 입력됩니다. %months{$1}
이는 해시 값이 key를 반환하도록 지시합니다 value
. 출력에는 일과 월이 모두 사용됩니다 sprintf
.
세 번째와 네 번째 코드 예제는 %months
해시 값이 한 번만 선언된다는 점을 제외하면 첫 번째 코드 예제와 유사합니다. -pe
또는 -ne
명령줄 플래그를 사용하는 대신 이 줄은 를 반복하는 데 사용됩니다 for lines()
. 마지막으로 Raku는 불변 문자열을 덮어쓰지 않도록 주의하므로 S///
대문자 S 형식을 사용합니다.결과 문자열 반환.
출력 예(모든 코드 예):
03.01.2023,
12.11.2017,
09.04.2022,