리눅스는 일년 내내 파일의 날짜 형식을 변경합니다

리눅스는 일년 내내 파일의 날짜 형식을 변경합니다

전체 연도 파일의 날짜 형식을 변경하려고 합니다. 이것은 내 데이터입니다.

06/30/21 07/01/21 05436841182400056721972 random text
07/06/21 07/07/21 05436841188400057034635 random text
07/17/21 07/19/21 05410191199637000037473 random text
07/21/21 07/22/21 55483821203091001733933 random text
07/24/21 07/26/21 55457021206837001077531 random text

이것이 내가 원하는 데이터의 모습입니다.

06/30/2021 07/01/2021 05436841182400056721972 random text
07/06/2021 07/07/2021 05436841188400057034635 random text
07/17/2021 07/19/2021 05410191199637000037473 random text
07/21/2021 07/22/2021 55483821203091001733933 random text
07/24/2021 07/26/2021 55457021206837001077531 random text

21이 파일의 다양한 위치에 있기 때문에 원하는 대로 대량 교체를 할 수 없습니다.

sed 's/21/2021/' junk_dates1
06/30/2021 07/01/21 05436841182400056721972 random text
07/06/2021 07/07/21 05436841188400057034635 random text
07/17/2021 07/19/21 05410191199637000037473 random text
07/2021/21 07/22/21 55483821203091001733933 random text
07/24/2021 07/26/21 55457021206837001077531 random text

날짜 뒤에 데이터가 있으므로 앵커 트릭을 사용하는 방법을 잘 모르겠습니다.

sed 's/21$/2021/' junk_dates1
06/30/21 07/01/21 05436841182400056721972 random text
07/06/21 07/07/21 05436841188400057034635 random text
07/17/21 07/19/21 05410191199637000037473 random text
07/21/21 07/22/21 55483821203091001733933 random text
07/24/21 07/26/21 55457021206837001077531 random text

답변1

$ sed -E -e 's=^([0-9]{2})/([0-9]{2})/([0-9]{2}) ([0-9]{2})/([0-9]{2})/([0-9]{2}) =\1/\2/20\3 \4/\5/20\6 =' input.txt 
06/30/2021 07/01/2021 05436841182400056721972 random text
07/06/2021 07/07/2021 05436841188400057034635 random text
07/17/2021 07/19/2021 05410191199637000037473 random text
07/21/2021 07/22/2021 55483821203091001733933 random text
07/24/2021 07/26/2021 55457021206837001077531 random text

20이는 , incl 접두사를 붙여야 하는 모든 두 자리 연도에 적용됩니다 21. 6개의 캡처 그룹을 사용하여 공백으로 구분된 첫 번째 및 두 번째 필드의 일, 월, 연도 숫자를 캡처합니다.

21그런데 정규식에서 두 개의 s 뒤에 공백 문자가 있다는 점에 유의하세요.그건필요한 "앵커"(또는 명확성 지점, 식별 표시 또는 무엇이든 부르고 싶은 것) - 찾아야 할 것은 "21"뿐만 아니라 "21 및 공백"입니다. 거의. 이것은 정확히 내가 한 일이 아니지만(줄의 시작 부분에 여러 캡처 그룹이 고정된 긴 일치 패턴 ^), 여기에서 에 없는 2자리 연도를 일치시키는 방법에 대해 생각하기 시작했습니다. 줄의 끝.

그러나 이렇게 하면 문제 중 하나가 해결되지만 MM/DD/YYYY 및 DD/MM/YYYY 날짜 형식에 내재된 모호성이 지속됩니다. 대신 ISO 8601, YYYY-MM-DD를 기반으로 한 날짜를 사용하세요. 예를 들어:

$ sed -E -e 's=^([0-9]{2})/([0-9]{2})/([0-9]{2}) ([0-9]{2})/([0-9]{2})/([0-9]{2}) =20\3-\1-\2 20\6-\4-\5 =' input.txt 
2021-06-30 2021-07-01 05436841182400056721972 random text
2021-07-06 2021-07-07 05436841188400057034635 random text
2021-07-17 2021-07-19 05410191199637000037473 random text
2021-07-21 2021-07-22 55483821203091001733933 random text
2021-07-24 2021-07-26 55457021206837001077531 random text

\d\d그런데 다음을 사용하는 대신 perl 정규식을 사용하여 읽는 것이 더 쉽습니다 [0-9]{2}.

$ perl -pe 's=^(\d\d)/(\d\d)/(\d\d) (\d\d)/(\d\d)/(\d\d) =20$3-$1-$2 20$6-$4-$5 =' input.txt 
2021-06-30 2021-07-01 05436841182400056721972 random text
2021-07-06 2021-07-07 05436841188400057034635 random text
2021-07-17 2021-07-19 05410191199637000037473 random text
2021-07-21 2021-07-22 55483821203091001733933 random text
2021-07-24 2021-07-26 55457021206837001077531 random text

sed불행하게도 Perl을 이해 하는 버전은 많지 않습니다 \d. 내가 아는 유일한 버전은 다음과 같습니다.슈퍼 sed-RPerl 정규식 구문을 사용하도록 지시하는 옵션이 있습니다 :

ssed -R 's=^(\d\d)/(\d\d)/(\d\d) (\d\d)/(\d\d)/(\d\d) =20\3-\1-\2 20\6-\4-\5 =' input.txt

데비안에서 실행 중인 경우 ssed패키지에 들어 있습니다. 다른 배포판용으로 패키지할 수도 있습니다. 어느 쪽이든 perl -por 을 사용하는 것보다 실제로 어떤 이점도 없습니다 perl -n.

답변2

나는 이것을 제안한다

$ sed 's;\(../../\)21;\12021;g' foo.txt
06/30/2021 07/01/2021 05436841182400056721972 random text
07/06/2021 07/07/2021 05436841188400057034635 random text
07/17/2021 07/19/2021 05410191199637000037473 random text
07/21/2021 07/22/2021 55483821203091001733933 random text
07/24/2021 07/26/2021 55457021206837001077531 ransom text

  • \(../../\)21슬래시 괄호는 의 대체에서 참조되는 \(...\)패턴을 캡처합니다 . 패턴이 이면 교체됩니다 .char char slash char char slash\1212021

옵션 -E( --regexp-extended)을 사용하면 더 명확해집니다 $ sed 's;(../../)21;\12021;g'.

답변3

삽입할 문자 위치(15 및 6)가 20항상 동일하다고 가정합니다.

sed 's/.\{15\}/&20/;s/.\{6\}/&20/' file
06/30/2021 07/01/2021 05436841182400056721972 random text
07/06/2021 07/07/2021 05436841188400057034635 random text
07/17/2021 07/19/2021 05410191199637000037473 random text
07/21/2021 07/22/2021 55483821203091001733933 random text
07/24/2021 07/26/2021 55457021206837001077531 random text

답변4

$ sed 's:/\(.. \):/20\1:g' file
06/30/2021 07/01/2021 05436841182400056721972 random text
07/06/2021 07/07/2021 05436841188400057034635 random text
07/17/2021 07/19/2021 05410191199637000037473 random text
07/21/2021 07/22/2021 55483821203091001733933 random text
07/24/2021 07/26/2021 55457021206837001077531 random text

작업하기가 더 쉽기 때문에 날짜 형식을 YYYY/MM/DD 또는 이와 유사한 형식으로 변경하는 것을 고려해야 합니다. 예를 들어 해당 형식의 날짜를 문자열로 정렬하고 비교할 수 있습니다.

$ sed 's:\(.....\)/\(..\) :20\2/\1 :g' file
2021/06/30 2021/07/01 05436841182400056721972 random text
2021/07/06 2021/07/07 05436841188400057034635 random text
2021/07/17 2021/07/19 05410191199637000037473 random text
2021/07/21 2021/07/22 55483821203091001733933 random text
2021/07/24 2021/07/26 55457021206837001077531 random text

또는 ISO 8601 표준:

$ sed 's:\(..\)/\(..\)/\(..\):20\3-\1-\2:g' file
2021-06-30 2021-07-01 05436841182400056721972 random text
2021-07-06 2021-07-07 05436841188400057034635 random text
2021-07-17 2021-07-19 05410191199637000037473 random text
2021-07-21 2021-07-22 55483821203091001733933 random text
2021-07-24 2021-07-26 55457021206837001077531 random text

관련 정보