sed가 첫 번째 일치에서만 작업을 수행하도록 하려면 어떻게 해야 합니까?

sed가 첫 번째 일치에서만 작업을 수행하도록 하려면 어떻게 해야 합니까?

이메일의 MIME 소스에서 헤더를 추출하는 bash 스크립트가 있습니다. 아이디어는 메시지의 헤더만 캡처하고 다른 것은 캡처하지 않는다는 것입니다. 그러나 그것은 제대로 작동하지 않습니다.

나는 그것이 다음을 수행하기를 원합니다 :

1) 이메일 상단부터 시작하세요.
2) "From"으로 시작하는 부분만 분리합니다(내 특정 업스트림 메일 서버는 항상 이것을 포함하는 줄로 헤더를 시작합니다).
3) 그 아래의 모든 줄을 캡처하십시오.첫 번째선을 넘어라.
4) 이메일의 나머지 부분에서 내용을 캡처하지 마세요.

이 sed 패턴을 사용하면 가능하다고 생각합니다.sed -n "/From/,/^$/p"

불행하게도 "From"의 다른 인스턴스에서 트리거됩니다. 예를 들어 누군가 다음 내용이 포함된 메시지를 전달하는 경우:

---------- Forwarded message ----------
From: Newsletter <[email protected]>
Date: Wed, Jan 28, 2015 at 9:16 PM
Subject: Blargenflugent
To: [email protected]

sed가 첫 번째 개행 문자 뒤의 내용을 무시하도록 만드는 방법은 무엇입니까?

답변1

sed '/From/,$!d;/./!q' <infile

...위 표현식은 sed마지막 행의 범위에 속하지 않는 출력에서 ​​모든 행을 제거 하도록 지시합니다 d. 줄을 삭제할 때마다 스크립트 읽기를 중지하고 맨 위에서 다음 입력 줄을 시작하므로 다음 명령을 읽지 않습니다.!/From/$d

따라서 /./!quit 명령은 uits 입력이 입력에서 최소한 단일 문자를 포함하지 않는 첫 번째 항목 이후 첫 번째 행에만 입력됨을 의미 sed합니다 q.From!.

답변2

sed -n '/From/!p;/From/{s/From/foo/;p;: rest; n; p; b rest;}' file

관련 정보