我试图提取要在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]
任何帮助将不胜感激。
formail
是一个很好的解决方案,但这里是如何使用sed做到这一点:
sed -e '/^$/q;/^To:/!d;n;:c;/^\s/!d;n;bc' message_file
/^$/q;
- (可选)退出,如果我们用完了头/^To:/!d;
- 如果不是要:头,停止处理该行n;
- 否则,隐式打印出来,并加载下一行:c;
- c是我们可以跳转到一个标签/^\s/!d;
- 否则,隐式打印出来,并加载下一行n;
- 分支回到标签℃(即环)这可能会为你工作(GNU SED):
bc
通过使用sed -n '/^To:/{:a;N;/^ /Ms/\s*\n\s*/ /;ta;P}' file
选项关闭隐打印。收集起来的线开始以空格,除去白色空间中的换行的任一侧,并通过一个单一的空间代替它,从开始-n
行开始。当匹配失败,则打印图案中的空间中的第一行。
要打印地址作为使用:
To:
我这样做是这样的:
sed '/^\S/h;G;/^To:/MP;d' file
要么:
cat _message_file | formail -X To: | awk '{$1=$1;printf("%s ",$0)};NR%2==0{print ""}'