grep命令找到空白行 - 在终端中工作,而不是在文件本身?

时间:2013-05-04 07:18:11

标签: perl parsing grep

我正在编写一个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保持空白。

2 个答案:

答案 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

换句话说,删除第一个空行。

请注意,你的正则表达式也是错误的,尽管在实践中是无害的。分隔线甚至不能包含任何空格(但我认为您永远不会找到具有仅空白标题行的真实电子邮件消息。)