sedが最初の一致でのみ作業を実行するにはどうすればよいですか?

sedが最初の一致でのみ作業を実行するにはどうすればよいですか?

電子メールのMIMEソースからヘッダーを抽出するbashスクリプトがあります。アイデアは、メッセージのヘッダーだけをキャプチャし、他のものはキャプチャしないことです。しかし、それは正しく動作しません。

私はそれが次のことをしたいと思います:

1) メールの上部から始めてください。
2)「From」で始まる部分だけを分離します(私の特定のアップストリームメールサーバーは常にこれを含む行でヘッダーを起動します)。
3) その下のすべての行をキャプチャします。最初線を越えて
4)Eメールの残りの部分からコンテンツをキャプチャしないでください。

この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入力が入力に少なくとも1文字を含まない最初の項目の後の最初の行にのみ入力されることを意味しsedますqFrom!.

おすすめ記事