我有一个 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
因此/./!q
uit 命令意味着sed
仅在其输入q
中第一次出现 后的第一行输入 uits 输入,该输入中至少不包含单个字符。From
!
.
答案2
sed -n '/From/!p;/From/{s/From/foo/;p;: rest; n; p; b rest;}' file