Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在Mac上运行MATLAB时令人讨厌的cat/sed行为_Macos_Matlab_Sed - Fatal编程技术网

Macos 在Mac上运行MATLAB时令人讨厌的cat/sed行为

Macos 在Mac上运行MATLAB时令人讨厌的cat/sed行为,macos,matlab,sed,Macos,Matlab,Sed,我正在运行一个脚本来解析文本电子邮件文件,这些文件可以被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,我会得到一个已解析的文本文件。如

我正在运行一个脚本来解析文本电子邮件文件,这些文件可以被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
,我会得到一个已解析的文本文件。如果我在MATLAB中使用
system
命令执行相同的操作,我偶尔会得到相同的解析文本,然后是错误消息

cat: stdout: Broken pipe
当我使用
sed
命令而不是
cat
命令时,我收到了相同的错误消息。这种情况可能发生在我正在解析的1%的文件上,几乎总是在
原始消息
行之后删除大量文件的大文件上。当我不包括最后一个管道时,我不会得到错误,即在“原始消息”之后删除所有内容的管道

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


我可能可以在MATLAB之外运行脚本并保存处理过的文件,但由于一些文件很大,我不希望在此时复制它们。

问题的出现是因为最后的gsed命令,
“$MYSED”“/\-原始消息\-/q”
。这(显然)会在看到匹配后立即退出,如果gsed馈送之后尝试写入任何内容,它将收到SIGPIPE并退出,如果有足够的数据,同样会发生在第一个gsed上,如果在该SIGPIPE之后有足够的数据,它将发送到原始的
cat
命令,该命令将报告错误。错误是否会返回到
cat
取决于定时、缓冲、数据量、月亮相位等

我的第一个建议是将
“$MYSED”“/\-原始消息\-/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_文件运行它。如果我对消息文件格式的假设是正确的,那么以这种方式更改gsed命令的顺序应该不会引起麻烦。是否有任何原因需要将消息文件通过管道传输到stdin,而不是作为参数传递并直接读取?

没有任何原因,我最初将该文件作为参数传递给第一个
sed
命令,但收到相同的错误,只是来自
sed
而不是
cat
。但是,将出现问题的
sed
命令移到行的前面可以解决问题,谢谢!