다음 내용이 포함된 파일이 있습니다.
$ 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 2020
3월 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