0

我正在运行一个脚本来解析可以由 MATLAB 调用或从命令行运行的文本电子邮件文件。脚本如下所示:

#!/bin/bash

MYSED=/opt/local/bin/gsed

"$MYSED" -n "/X-FileName/,/*/p" | "$MYSED" "/X-FileName/d" | "$MYSED" "/\-Original Message\-/q" 

如果我cat message_file | ./parser.sh在终端窗口中运行,我会得到一个解析的文本文件。如果我system在 MATLAB 中使用命令执行相同操作,我偶尔会得到相同的解析文本,然后是错误消息

cat: stdout: Broken pipe

当我使用sed命令而不是cat命令时,我收到了相同的错误消息。这可能发生在我正在解析的 1% 的文件上,几乎总是Original Message在行后删除很多文件的大文件。当我不包含最后一个管道时,我没有收到错误消息,即删除“原始消息”之后的所有内容的管道。

如果可能,我想禁止来自 cat 的错误消息。理想情况下,我想了解为什么通过 MATLAB 运行脚本会给我一个错误,而在终端中运行它却不会?由于它往往发生在较大的文件上,我猜它与内存限制有关,但“断管”是一个模糊的错误消息,我无法确定。任何关于这两个问题的提示将不胜感激。

我可能可以在 MATLAB 之外运行脚本并保存处理过的文件,但由于某些文件很大,我现在宁愿不复制它们。

4

1 回答 1

1

由于最终的 gsed 命令"$MYSED" "/\-Original Message\-/q". 这(显然)一看到匹配就退出,如果 gsed 喂它试图在之后写任何东西,它将接收 SIGPIPE 并退出,如果有足够的数据,第一个 gsed 也会发生同样的情况,如果有SIGPIPE 之后的足够数据将被发送到cat报告错误的原始命令。错误是否返回cat将取决于时间、缓冲、数据量、月相等。

我的第一个建议是将"$MYSED" "/\-Original Message\-/q"命令放在管道的开头,并让它从文件中读取(而不是从 cat 中读取)。这意味着更改脚本以接受要从中读取的文件作为参数:

#!/bin/bash

MYSED=/opt/local/bin/gsed

"$MYSED" "/\-Original Message\-/q" "$@" | "$MYSED" -n "/X-FileName/,/*/p" | "$MYSED" "/X-FileName/d"

...然后使用./parser.sh message_file. 如果我对消息文件格式的假设是正确的,那么以这种方式更改 gsed 命令的顺序应该不会造成麻烦。消息文件是否有任何理由需要通过管道传输到标准输入,而不是作为参数传递并直接读取?

于 2013-01-26T22:33:24.630 回答