未正确替换shell脚本变量中的换行符

未正确替换shell脚本变量中的换行符,shell,unix,newline,Shell,Unix,Newline,情况:使用shell脚本(bash/ksh),应该在控制台日志中显示一条消息,然后通过电子邮件发送 问题:消息中有换行符 示例如下: ErrMsg="File names must be unique. Please correct and rerun. Duplicate names are listed below: File 1.txt File 1.txt File 2.txt File 2.txt File 2.txt" echo "${ErrMsg}" # OK.

情况:使用shell脚本(bash/ksh),应该在控制台日志中显示一条消息,然后通过电子邮件发送

问题:消息中有换行符

示例如下:

   ErrMsg="File names must be unique. Please correct and rerun.
Duplicate names are listed below:
File 1.txt
File 1.txt
File 2.txt
File 2.txt
File 2.txt"
   echo "${ErrMsg}"
   # OK. After showing the message in the console log, send an email
问题:如何将这些换行符转换为电子邮件的HTML换行符

约束:我们必须发送HTML电子邮件。下游流程(如Microsoft Outlook)太不一致,其他任何流程都无法使用。简单的文本电子邮件是一个很好的选择,但在这种情况下是不可能的

为了清楚起见,不需要完全删除换行符,但是只要有换行符,就必须插入HTML换行符


之所以提出这个问题,是因为我已经尝试过使用多个命令,例如
sed
tr
、和
awk
,并取得了不同程度的成功。

TL;DR:以下代码片段将完成此工作:

ErrMsg=`echo "$ErrMsg"|awk 1 ORS='<br/>'`
使用
awk
根据使用
awk
最初似乎是可行的,但由于使用
echo
的一些其他情况,出现了一个微妙的问题。该解决方案如中所述

必须在变量周围加上双引号,否则echo将删除所有换行符。
(当然,
awk
将接收结尾带有换行符的字符,因为这是
echo
在echo之后所做的。)

这个片段是好的:(中间的行中断被保存并正确替换)


您可以使用
将邮件包装在
HTML
中,例如

<pre>
${ErrMsg}
and more.
</pre>

${ErrMsg}
还有更多。

这是一个很好的建议,但不幸的是,MS Outlook 2013不会自动尊重
中包装的文本换行符。。。所以消息仍然需要真正的HTML换行符。
ErrMsg=`echo "$ErrMsg"|awk 1 ORS='<br/>'`
ErrMsg=`echo $ErrMsg|awk 1 ORS='<br/>'`
<pre>
${ErrMsg}
and more.
</pre>