![특정 문자열로 시작하는 줄만 sed](https://linux55.com/image/199151/%ED%8A%B9%EC%A0%95%20%EB%AC%B8%EC%9E%90%EC%97%B4%EB%A1%9C%20%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94%20%EC%A4%84%EB%A7%8C%20sed.png)
나는 다음과 같은 파일 형식을 가지고 있습니다
Received from +11231231234 at 2021-10-10T19:56:50-07:00:
This is a message that contains words like from, at, etc.
Sent to +11231231234 at 2021-10-11T06:50:57+00:00:
This is another message that contains words like to, at, etc.
"수신" 및 "전송" 줄을 정리하고 싶습니다. 다음 sed 명령을 사용하면 됩니다.
cat file | sed 's/from//g' | sed 's/to/ /g' | sed 's/+\w\+//' | sed 's/at//g' | \
sed 's/T/ /g' | sed 's/[[:digit:].]*\:$//' | sed 's/[[:digit:].]*\:$//' | sed 's/-$//' | \
sed 's/-$//' | sed 's/+$//'
다음 결과를 생성합니다
Received 2021-10-10 19:56:50
This is a message that contains words like , , etc.
Sent 2021-10-11 06:50:57
This is another message that contains words like , , etc.
보시다시피 "Received" 및 "Sent" 줄이 정말 잘 정리됩니다. 하지만 메시지 라인도 정리됩니다! "Received" 및 "Sent"로 시작하는 줄에만 이러한 작업을 적용하려면 어떻게 해야 합니까?
답변1
sed의 주소는 다음과 같습니다.
sed -E '/^(Received|Sent) (from|to) \+[0-9]+ at/ s/ .*([0-9]{4}-[0-9]{2}-[0-9]{2})T([0-9:]{8}).*/ \1 \2/'
Received
주소는 대체가 or 로 시작하고Sent
그 뒤에from
or 가to
오고+
그 뒤에 숫자 sum 이 오는 줄에만 적용된다는 것을 의미합니다at
.- 교체는 공백과 일치하기 시작하고 날짜를 캡처합니다
[0-9]{4}
(네 번 반복되는 숫자등. );T
시간을 다시 일치시키고 캡처합니다. 시간 이후의 콘텐츠는 일치하지만 캡처되지는 않습니다. 그러면 일치하는 부분 전체가 몇 개의 공백과 캡처된 날짜 및 시간으로 대체됩니다.