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

时间:2017-07-14 15:24:16

标签: 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. After showing the message in the console log, send an email

问题:如何将这些换行符转换为电子邮件的HTML换行符?

约束:我们必须使用HTML电子邮件。下游流程(例如Microsoft Outlook)与其他任何可用的东西都不一致。简单的文本电子邮件是一个不错的选择,但是在这种情况下不在桌面上。

需要说明的是,的换行符需要完全删除,但只要有换行符,就必须插入HTML换行符

正在询问此问题,因为我已尝试使用多个命令,例如sedtrawk,并取得了不同程度的成功。

2 个答案:

答案 0 :(得分:0)

TL; DR :以下代码段将完成此任务:

ErrMsg=`echo "$ErrMsg"|awk 1 ORS='<br/>'`

使用echo时,请确保变量周围有双引号。

事实证明这是一个棘手的情况。下面有一些解释说明。

使用sed

事实证明,sed逐行读取输入,这使得查找和替换这些新行有点超出常规。有几个巧妙的技巧似乎有效,但我觉得它们太复杂了,无法适当地应用于这种相当简单的情况。

使用tr

根据this answertr命令应该有效。不幸的是,这只是按字符翻译。两个字符串的长度不同,我只能将换行符翻译成空格或其他单个字符。

对于以下内容:

ErrMsg="Line 1
Line 2
"
ErrMsg=`echo $ErrMsg| tr '\n' 'BREAK'`

# You might expect:
# "Line 1BREAKLine 2BREAK"
# But instead you get:
# "Line 1BLine 2B"
echo "${ErrMsg}"

使用awk

根据this answer使用awk最初似乎有效,但由于echo的某些其他情况,存在一个微妙的问题。该解决方案在this forum中注明。

你的变量必须有双引号,否则echo会删除所有换行符。
(当然,awk会收到带换行符的字符。结束,因为echo之后回复的东西是什么。)

此代码段很好:(中间的换行符会被保留并正确替换)

ErrMsg=`echo "$ErrMsg"|awk 1 ORS='<br/>'`

这段剪辑很糟糕:(换行符由echo转换为空格,结尾处有一个换行符)

ErrMsg=`echo $ErrMsg|awk 1 ORS='<br/>'`

答案 1 :(得分:0)

您可以使用HTML将您的邮件包裹在<pre>中,例如

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