如何提取电子邮件标题从文件的多个线路延伸

问题描述 投票:1回答:3

我试图提取要在Linux上使用SED的电子邮件文件头。

问题是,到标题可能是多条线路上。

e.g:

To: [email protected], [email protected],
    [email protected], [email protected], 
    [email protected]
Message-ID: <[email protected]>

我试过如下:

sed -n -e '/^[Tt]o: / { N; p; }' _message_file_ |
    awk '{$1=$1;printf("%s ",$0)};NR%2==0{print ""}'

sed命令提取开始要和下一行就行了。我管道输出到awk来把所有东西都在一行。

一条线中的完整的命令输出:

To: [email protected], [email protected], [email protected], [email protected]

我不知道该怎么继续下去,测试,如果下一行以空白字符开始,并将其添加到结果。

我想所有的地址是

To: [email protected], [email protected], [email protected], [email protected], [email protected]

任何帮助将不胜感激。

linux email awk sed grep
3个回答
2
投票

formail是一个很好的解决方案,但这里是如何使用sed做到这一点:

sed -e '/^$/q;/^To:/!d;n;:c;/^\s/!d;n;bc' message_file 
  • /^$/q; - (可选)退出,如果我们用完了头
  • /^To:/!d; - 如果不是要:头,停止处理该行
  • n; - 否则,隐式打印出来,并加载下一行
  • :c; - c是我们可以跳转到一个标签
  • qazxsw POI - 如果不延续,停止处理该行
  • /^\s/!d; - 否则,隐式打印出来,并加载下一行
  • n; - 分支回到标签℃(即环)

1
投票

这可能会为你工作(GNU SED):

bc

通过使用sed -n '/^To:/{:a;N;/^ /Ms/\s*\n\s*/ /;ta;P}' file 选项关闭隐打印。收集起来的线开始以空格,除去白色空间中的换行的任一侧,并通过一个单一的空间代替它,从开始-n行开始。当匹配失败,则打印图案中的空间中的第一行。

要打印地址作为使用:

To:

1
投票

我这样做是这样的:

sed '/^\S/h;G;/^To:/MP;d' file

要么:

cat _message_file | formail -X To: | awk '{$1=$1;printf("%s ",$0)};NR%2==0{print ""}'
© www.soinside.com 2019 - 2024. All rights reserved.