情况:使用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
,并取得了不同程度的成功。
答案 0 :(得分:0)
TL; DR :以下代码段将完成此任务:
ErrMsg=`echo "$ErrMsg"|awk 1 ORS='<br/>'`
使用echo
时,请确保变量周围有双引号。
事实证明这是一个棘手的情况。下面有一些解释说明。
sed
事实证明,sed
逐行读取输入,这使得查找和替换这些新行有点超出常规。有几个巧妙的技巧似乎有效,但我觉得它们太复杂了,无法适当地应用于这种相当简单的情况。
tr
根据this answer,tr
命令应该有效。不幸的是,这只是按字符翻译。两个字符串的长度不同,我只能将换行符翻译成空格或其他单个字符。
对于以下内容:
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>