Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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
Bash 如何从shellscript获取电子邮件中的换行符?_Bash_Perl_Email_Awk_Sed - Fatal编程技术网

Bash 如何从shellscript获取电子邮件中的换行符?

Bash 如何从shellscript获取电子邮件中的换行符?,bash,perl,email,awk,sed,Bash,Perl,Email,Awk,Sed,有一个shell脚本(bash),用于检查csv文件中是否有不匹配模式的行,并发送错误行的邮件。这很好,但是当组合错误的行时,linux会给出一个\r换行符,但在电子邮件中没有换行符。所以我尝试以换行符的形式发送\r\n,但没有效果,perl或bash会删除\r\n换行符 以下是一个简单的工作脚本示例: SUBJECT="Error while parse CSV" TO="rcpt@domain.tld" wrongLines=$(perl -ne 'print "Row $.: $_\r\n

有一个shell脚本(bash),用于检查csv文件中是否有不匹配模式的行,并发送错误行的邮件。这很好,但是当组合错误的行时,linux会给出一个\r换行符,但在电子邮件中没有换行符。所以我尝试以换行符的形式发送\r\n,但没有效果,perl或bash会删除\r\n换行符

以下是一个简单的工作脚本示例:

SUBJECT="Error while parse CSV"
TO="rcpt@domain.tld"
wrongLines=$(perl -ne 'print "Row $.: $_\r\n" if not /^00[1-9]\d{4,}$/' $file)
MESSAGE="Error while parse following Lines, pattern dont match: \r\n $wrongLines"
echo $MESSAGE |od -c
od的输出为:

0000000   E   r   r   o   r       w   h   i   l   e       p   a   r   s
0000020   e       f   o   l   l   o   w   i   n   g       L   i   n   e
0000040   s   ,       p   a   t   t   e   r   n       d   o   n   t
0000060   m   a   t   c   h   :       \   r   \   n       R   o   w
0000100   2   :       4   9   2   7   8   3   8   7   4   3      \r   R
0000120   o   w       3   :       4   8   2   3   2   8   9   7   3   8
0000140      \r  \n
0000143

但是在od输出中删除行之间的\n的原因是什么?我也尝试\x0D\x0A而不是\r\n,但这也没有帮助。有什么建议吗?

你的问题是你没有使用引号

看:

如果没有引号,您将成为和的受害者(上面的示例中没有说明)

此外,添加
\r
\n
(即逐字反斜杠后跟r或n)也没有任何帮助

结论:引用每个变量展开式!永远!(除非你真的是指一个glob模式——在这种情况下,你还将在代码中添加一条注释来解释为什么你故意不引用扩展)

旁注:

建议您对自己的参数使用小写名称,以免和Bash内部变量和环境变量使用的所有大写变量名称混淆


使用更多引号:
echo“$MESSAGE”
。你不想要
\r
。也许你应该看看?或者改用?@gniourf\n序列
\r\n
是许多基于文本的协议中的标准换行符。@JoachimPileborg:我的评论主要是关于使用引号…(我不确定反斜杠后跟r(或n)会起什么作用)。@gniourf\n使用正确的选项
echo
(或者使用
printf
)在以这种方式引入换行符和回车符的大多数其他环境中,反斜杠将按预期工作。关于引号的部分是正确且重要的。唯一奇怪的是,文本后面和concat之前的换行符在echo命令中也有一个没有引号的换行符。
$ a="A multi-line
input
variable"
$ echo $a
A multi-line input variable
$ echo "$a"
A multi-line
input
variable
$