날짜를 찾은 후에만 행을 분할하는 방법

날짜를 찾은 후에만 행을 분할하는 방법

내 파일에 다음 내용이 있습니다.

Thu_Jun_04_09:30:22_2020=some_string:some_string=Thu_Jun_04_09:32:04_2020=some_str:some_string=some_string=Thu_Jun_04_09:35:05_2020=some_str:some_string,some_str

날짜가 발견된 경우에만 이 행을 분할하고 싶습니다. 그러나 날짜 형식은 항상 동일하지만 날짜는 변경될 수 있습니다. 그래서 다음 형식으로 출력을 원합니다.

Thu_Jun_04_09:30:22_2020=some_string:some_string
Thu_Jun_04_09:32:04_2020=some_str:some_string=some_string
Thu_Jun_04_09:35:05_2020=some_str:some_string,some_str

줄 사이에 문자열을 추가할 수 있지만 날짜가 발견된 경우에만 문자열을 분할해야 한다는 점을 고려하세요.

답변1

다음 정규식 패턴은 날짜 형식과 일치합니다.

((Mon|Tue|Wed|Thu|Fri|Sat|Sun)_(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)_[0-9]+_[0-9]+:[0-9]+:[0-9]+_[0-9]+)

GNU를 사용하면 각 날짜 앞에 하나씩 추가 sed할 수 있습니다 .\n

echo "Thu_Jun_04_09:30:22_2020=some_string:some_string=Thu_Jun_04_09:32:04_2020=some_str:some_string=some_string=Thu_Jun_04_09:35:05_2020=some_str:some_string,some_str"\
     | sed -Ee 's/((Mon|Tue|Wed|Thu|Fri|Sat|Sun)_(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)_[0-9]+_[0-9]+:[0-9]+:[0-9]+_[0-9]+)/\n\1/g'

처음에 생성된 빈 줄이 귀찮다면 파이프로 연결할 수 있습니다.sed -e '/^$/d'

답변2

이상적으로는 무엇이든 수정할 수 있습니다.생산하다데이터는 올바른 위치에 줄 바꿈을 삽입합니다. "어떤 문자열"이 실제로어느텍스트인 경우 행( )의 다른 날짜와 동일한 형식의 날짜일 수 있으므로 Thu_Jun_04_09:30:22_2020=Thu_Jun_04_09:30:22_2020=Thu_Jun_04_09:30:22_2020:Thu_Jun_04_09:30:22_2020사용하기가 어렵습니다. 따라서 항상 포함하는 것이 좋습니다.실제문제의 데이터.

특히 sed질문에 제공된 데이터를 사용하여 GNU를 사용합니다.

$ sed 's/=\(..._\)/\n\1/g' file
Thu_Jun_04_09:30:22_2020=some_string:some_string
Thu_Jun_04_09:32:04_2020=some_str:some_string=some_string
Thu_Jun_04_09:35:05_2020=some_str:some_string,some_str

그러면 =이전의 각 내용이 Thu_개행 문자로 대체됩니다.

Thu_..._"세 문자와 밑줄"과 일치합니다 . 너무 약하면 사용해야 할 수도 있습니다.

sed -E 's/=((Mon|Tue|Wed|Thu|Fri|Sat|Sun)_)/\n\1/g' file

대신 유효한 모든 요일 이름을 명시적으로 일치시키세요.

개행 문자를 삽입하는 명령을 사용하지 않는 (또는 확장된 정규식을 사용하는 ) sed표준으로 GNU가 필요하다는 점에 유의하세요 .seds///-E

관련 정보