【问题标题】:Grep command to find blank line - works in terminal, not in the file itself?用于查找空行的 Grep 命令 - 在终端中工作,而不是在文件本身中工作?
【发布时间】:2013-05-04 07:18:10
【问题描述】:

我正在编写一个 perl 脚本,由 qmail 为每个传入的邮件调用,以解析内容并找到电子邮件的正文。这样做的原因是从数据库中添加一些用户信息,将其附加到正文中,然后转发到另一个地址(列表服务器)。

无法解决的问题是这样的:

cat dbody.txt|grep -A1000 '^\s*$'

目的:找到第一个空行(作为头信息的结尾),然后全部返回

当我从命令行(使用终端)(即直接)运行该行时 - 它工作正常。返回电子邮件的正文。

当我在脚本本身中运行它时 - 它没有

已经进行了无休止的测试,无法想出为什么会这样,或者我应该改变什么。帮忙!

脚本中的行 - 第一个“测试” - 工作正常。

$test =`cat dbody.txt|grep -A1000 '^\s*$'`;
$body= `cat dbody.txt|grep -A1000 '2,/^$/d'`;

当我将以上内容打印到最终电子邮件中时 - $test 返回全文(作为测试),$body 保持空白。

【问题讨论】:

  • 我不知道您是如何设法在 Perl 中产生任何结果的。你在用system函数吗?
  • @perreal 不,他只是使用了错误的降价格式,所以他的反引号没有显示。
  • @TLP,哦,好的,有道理:)
  • 如果您有超过 1000 行的消息,您将截断它。根据你的描述,我猜这不是故意的。 (大于约 40KB 的 base64 附件足以超过 1000 行边界。)
  • 只是想知道您何时将此问题标记为perl,为什么您不使用例如Email::Simple (search.cpan.org/~rjbs/Email-Simple-2.100/lib/Email/Simple.pm) 进行正确的消息解析。 (和标题也修改)

标签: perl parsing grep


【解决方案1】:

你可以像这样使用 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`;

【讨论】:

  • 或者绕过Perl双引号行为,将脚本赋值给单引号中的变量,然后对变量进行插值; my $script = q(sed '1,/^$/d'); my $body = qx($script);(...我正在使用通用引用机制来提高可读性并解决标记缺乏问题,您可能会发现其他适合您的引用组合。)
  • 完美——第二部分,转义了美元符号,可以解决我最初描述的问题。一千多谢。
【解决方案2】:

sed中的标准解决方案:

sed '1,/^$/d' dbody.txt

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

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

【讨论】:

  • 感谢您的回复,太好了。感谢 UUCA 豁免。 sed 选项也有效 - 谢谢 - 但最初的问题仍然存在:sed 从命令行工作,但不在脚本本身中。处理时它只是返回空。有什么想法吗?
  • @user2349186,你需要像\$^这样对美元符号进行转义,perl认为它是一个变量。
  • 你是如何调用脚本的?如果qmail 有自己的报价解释和/或美元替代,那可能是所有这些问题的根源。将脚本存储在单独的 shell 脚本中应该可以让您解决任何此类问题。
  • 啊,或者 Perl 脚本,是的!现在我懂了。 @perreal 的诊断很准确;是 Perl,而不是 Qmail,做自己的引号解释和变量替换。
  • 同意 - 解决了我遇到的问题。 @perreal 和 Triplee 非常感谢您抽出宝贵时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 2021-12-23
  • 1970-01-01
  • 2022-01-02
  • 2016-09-15
  • 2012-05-28
相关资源
最近更新 更多