如何在Unix Bash脚本中用新行替换“ \ n”字符串

时间:2018-08-28 19:29:37

标签: bash shell variables unix

似乎无法在线找到答案...

我有一个字符串变量(外部来源),其中新行"\n"被编码为字符串。

我想将这些字符串替换为实际的换行符。下面的代码可以实现这一目标...

echo $EXT_DESCR | sed 's/\\n/\n/g'

但是当我尝试将结果存储到它自己的变量中时,它将它们转换回字符串

NEW_DESCR=`echo $EXT_DESCR | sed 's/\\n/\n/g'`

这如何实现,或者我做错了什么?

这是我一直在测试的代码,试图获得正确的结果

EXT_DESCR="This is a text\nWith a new line"
echo $EXT_DESCR | sed 's/\\n/\n/g'

NEW_DESCR=`echo $EXT_DESCR | sed 's/\\n/\n/g'`
echo ""
echo "$NEW_DESCR"

4 个答案:

答案 0 :(得分:7)

无需sed,只需使用parameter expansion

$ foo='1\n2\n3'; echo "${foo//'\n'/$'\n'}"  
1
2
3

对于bash 4.4或更高版本,您可以在${parameter@operator}中使用E运算符:

$ foo='1\n2\n3'; echo "${foo@E}"
1
2
3

答案 1 :(得分:5)

其他答案包含替代解决方案。 (我特别喜欢参数扩展一。)

这是您尝试中的问题所在

echo $EXT_DESCR | sed 's/\\n/\n/g'

sed命令用单引号引起来,因此sed照原样获得s/\\n/\n/g

NEW_DESCR=`echo $EXT_DESCR | sed 's/\\n/\n/g'`

整个命令位于反引号中,因此将应用一轮反斜杠处理。导致sed获得代码s/\n/\n/g,但它什么也没做。

此代码的可能解决方法:

NEW_DESCR=`echo $EXT_DESCR | sed 's/\\\\n/\\n/g'`

通过加反斜杠加倍,我们在sed中得到了正确的命令。

或(更轻松):

NEW_DESCR=$(echo $EXT_DESCR | sed 's/\\n/\n/g')

使用$( )而不是反引号,ALL_UPPERCASE的转义规则较少。

注意:不要将UPPERCASE用于您的shell变量。 HOME(非正式地)保留给系统变量(例如{{1})和特殊的内置变量(例如IFSRANDOM)。

答案 2 :(得分:2)

printf将通过解释所有转义的结构来完成这项工作:

printf -v NEW_DESCR "%b" "$EXT_DESCR"

-v选项会将输出存储在变量中,因此无需在此处使用命令替换。

您的方法存在的问题是使用了旧的倒行标记。您可以这样做:

NEW_DESCR=$(echo "$EXT_DESCR" | sed 's/\\n/\n/g')

假设您将gnu sed用作BSD sed不能使用这种方法。

答案 3 :(得分:1)

取决于您的确切需求:

echo -e $EXT_DESCR

可能就是您所需要的。

从echo手册页:

-e     启用反斜杠转义的解释