특정 문자열로 시작하는 줄만 sed

특정 문자열로 시작하는 줄만 sed

나는 다음과 같은 파일 형식을 가지고 있습니다

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그 뒤에 fromor 가 to오고 +그 뒤에 숫자 sum 이 오는 줄에만 적용된다는 것을 의미합니다 at.
  • 교체는 공백과 일치하기 시작하고 날짜를 캡처합니다 [0-9]{4}(네 번 반복되는 숫자등. ); T시간을 다시 일치시키고 캡처합니다. 시간 이후의 콘텐츠는 일치하지만 캡처되지는 않습니다. 그러면 일치하는 부분 전체가 몇 개의 공백과 캡처된 날짜 및 시간으로 대체됩니다.

관련 정보