如何让 sed 仅对第一场比赛执行操作?

如何让 sed 仅对第一场比赛执行操作?

我有一个 bash 脚本,可以从电子邮件的 MIME 源中提取标头。我的想法是,我只想捕获消息的标头,而不是其他任何东西。但它并不太正常工作。

我希望它执行以下操作:

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 命令意味着sed仅在其输入q中第一次出现 后的第一行输入 uits 输入,该输入中至少不包含单个字符。From!.

答案2

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

相关内容