내 파일에 다음 내용이 있습니다.
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가 필요하다는 점에 유의하세요 .sed
s///
-E