我正在编写一个perl脚本,由qmail为每个收到的邮件调用,以解析内容并找到电子邮件的正文。这样做的原因是从数据库添加一些用户信息,将其附加到正文,然后转发到另一个地址(listserv)。
不可解决的问题是:
cat dbody.txt|grep -A1000 '^\s*$'
目的:找到第一个空行(作为标题信息的结尾)并在此之后返回所有
当我从命令行(使用终端)(即直接)运行该行时 - 它工作正常。返回电子邮件的正文。
当我在脚本中运行它时 - 它不会。
经过无休止的测试,无法想出为什么会这样,或者我应该改变什么。帮助!
脚本中的行 - 第一个“测试” - 工作正常。
$test =`cat dbody.txt|grep -A1000 '^\s*$'`;
$body= `cat dbody.txt|grep -A1000 '2,/^$/d'`;
当我将上述内容打印到最终电子邮件中时 - $ test返回全文(作为测试),$ body保持空白。
答案 0 :(得分:2)
您可以像这样使用Perl:
use strict;
use warnings;
my $body;
open my $file, "<", "dbody.txt" or die("$!");
while (<$file>) {
$body .= $_ if defined $body;
$body = "" if not defined $body and /^$/;
}
close $file;
print $body;
或者,逃避美元符号:
$body= `grep -A1000 '2,/^\$/d' dbody.txt`;
答案 1 :(得分:1)
sed
中的标准解决方案:
sed '1,/^$/d' dbody.txt
换句话说,删除第一个空行。
请注意,你的正则表达式也是错误的,尽管在实践中是无害的。分隔线甚至不能包含任何空格(但我认为您永远不会找到具有仅空白标题行的真实电子邮件消息。)