在bash中用\替换\ n

时间:2017-07-17 13:17:09

标签: string bash replace line-breaks

[更新的问题]

我有一个变量$CHANGED,它存储一个subversion命令的输出,如下所示:CHANGED="$(svnlook changed -r $REV $REPOS)"

执行svnlook changed -r $REV $REPOS会将以下内容输出到命令行:

A /path/to/file
A /path/to/file2
A /path/to/file3

但是,我需要将如下所示格式的输出存储在变量$FILES

A /path/to/file<br />A /path/to/file2<br />A /path/to/file3<br />

我需要在生成电子邮件按摩的命令中使用$FILES

sendemail [some-options] $FILES

它应该用$FILES替换A /path/to/file<br />A /path/to/file2<br />A /path/to/file3<br />,以便它可以解释html break标记。

3 个答案:

答案 0 :(得分:4)

在bash中:

echo "${VAR//$'\n'/<br />}"

请参阅Parameter Expansion

答案 1 :(得分:0)

您可以修改hek2mgl's answer以删除第一个<br />(如果有):

CHANGED="
A /path/to/file
A /path/to/other/file
A /path/to/new/file
"

FILES="$(echo "${CHANGED//$'\n'/<br />}" | sed 's#^<br />##g')"

echo "$FILES"

输出:

A /path/to/file<br />A /path/to/other/file<br />A /path/to/new/file<br />

<小时/> 另一种方式(只有sed):

FILES="$(echo "$CHANGED" | sed ':a;N;$!ba;s#\n#<br />#g;s#^<br />##g')"

答案 2 :(得分:0)

手册页的Parameter Expansion部分是您的朋友。

开始
changed="
A /path/to/file
A /path/to/other/file
A /path/to/new/file
"

您可以使用#%扩展来移除前导和尾随换行符:

files="${changed#$'\n'}"
files="${files%$'\n'}"

然后用<br />替换其他换行符:

files="${files//$'\n'/<br />}"

演示:

printf '***%s***\n' "$files"
***A /path/to/file<br />A /path/to/other/file<br />A /path/to/new/file***

(请注意,我已将您的全大写变量名称更改为小写。避免使用本地大写名称,因为这些名称倾向于通过环境进行通信。)

如果您不喜欢将换行符写为$'\n',您当然可以将其存储在变量中:

nl=$'\n'
files="${changed#$nl}"
files="${files%$nl}"
files="${files//$nl/<br />}"