使用sed / awk截断长电子邮件标头

时间:2014-09-26 02:05:27

标签: bash email awk sed

我在电子邮件标题中有一个很长的字段,其中包含多行,如下所示:

To: John Smith <johnsmith@example.com>, Alex Smith <alexsmith@example.com>,
    Superman Smith <supermansmith@example.com>, Devin Smith <devinsmith@example.com>,
    Al Smith <alsmith@example.com>, Jane Smith <janesmith@example.com>,
    Thomas Smith <thomassmith@example.com>

我想将其截断为更短的内容,例如:

To: John Smith <johnsmith@example.com>, Alex Smith <alexsmith@examp...

基本上,我希望输出为一行,尽可能在终端窗口的宽度内拟合(我猜是使用$ COLUMNS变量)。

2 个答案:

答案 0 :(得分:2)

formail实用程序非常方便:

formail -c < ~/tmp/email.eml | 
sed -r 's/\t/ /g; s/^(.{'$(( $(tput cols) - 5))'}).*/\1 .../'

formail可以在procmail

中找到

使用tput查询终端尺寸

答案 1 :(得分:1)

目前还不清楚你这样做的上下文,但是如果文件中包含电子邮件,

 awk -v maxLineSz=${COLUMNS:-80} \
   '/^To:/{if (length() > maxLineSz-4) { $0=substr($0,1,maxLineSz-4) "..." }}1' emailFile 

<强>输出

To: John Smith <johnsmith@example.com>, Alex Smith <alexsmith@example.com>, Supe...

受影响的唯一行是以“收件人:”

开头的行

最后的1,确保打印所有输入行。