sed를 사용하여 파일의 날짜 형식을 월 일, 연도에서 일 월 연으로 변경합니다.

sed를 사용하여 파일의 날짜 형식을 월 일, 연도에서 일 월 연으로 변경합니다.

다음 내용이 포함된 파일이 있습니다.

$ cat file.txt
on that date April 02, 2020 end of line
March 5, 2021 helloooo world
J 14, 2022
error 3, bye

날짜 형식을 "월 일 연도"에서 "일 월 연도"로 변경하고 싶습니다. 월은 항상 대문자로 시작하고, 날짜는 한 자리 또는 두 자리, 연도는 네 자리입니다.

원하는 출력:

on that date 02 April 2020 end of line
5 March 2021 helloooo world
14 J 2022
error 3, bye

다음을 시도했는데 날짜와 연도를 얻을 수 있지만 달은 얻을 수 없습니다

sed -r 's/([0-9]*[0-9]), ([0-9]{4})//g'

Linux 시스템에서 sed를 사용하여 이 작업을 어떻게 수행할 수 있나요?

답변1

데이터가 표시된 것과 같고 Foo 12, 0000날짜로 처리해서는 안 되는 것과 같은 것이 없다고 가정할 때 이를 수행하는 방법은 다음과 같습니다.

$ sed -E 's/([A-Z][a-z]+) ([0-9]{1,2}), ([0-9]{4})\b/\2 \1 \3/g' file
on that date 02 April 2020 end of line
5 March 2021 helloooo world
J 14, 2022
error 3, bye

대문자 다음에 하나 이상의 소문자( [A-Z][a-z]+), 공백과 하나 또는 두 개의 숫자( [0-9]{1,2}), 쉼표와 공백 및 정확히 4개의 숫자, 단어 경계( \b: 단어에서 비- 단어 변환; 공백, 줄 끝 또는 단어 문자가 아닌 모든 것과 일치합니다. 괄호 안에포착해당 그룹 을 넣은 \1다음 이를 교체에 사용하겠습니다.\2\3

J 14, 2022이는 유효한 날짜가 아니기 때문에 작동하지 않습니다 . 예를 들어 M 14 20203월 14일인가요, 아니면 5월 14일인가요? 정말로 이와 같은 것을 일치시키고 싶다면 다음을 시도해 볼 수 있습니다.

$ sed -E 's/([A-Z][a-z]*) ([0-9]{1,2}), ([0-9]{4})\b/\2 \1 \3/g' file
on that date 02 April 2020 end of line
5 March 2021 helloooo world
14 J 2022
error 3, bye

마지막으로, 해당 월의 첫 글자로 찾을 수 있는 대문자만 찾아 좀 더 구체적으로 만들 수도 있습니다.

sed -E 's/([JFMASOND][a-z]*) ([0-9]{1,2}), ([0-9]{4})\b/\2 \1 \3/g' file

관련 정보