“如何替换”\";在Unix Bash脚本中使用新行的字符串

“如何替换”\";在Unix Bash脚本中使用新行的字符串,bash,shell,variables,unix,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

似乎无法在网上找到此问题的答案

我有一个字符串变量(外部来源),新行
“\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"

根据您的具体需要:

echo -e $EXT_DESCR
可能就是你所需要的

从echo手册页:

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

无需使用
sed
,使用:


使用
bash 4.4
或更新版本,您可以在以下位置使用
E
操作符:


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

printf -v NEW_DESCR "%b" "$EXT_DESCR"
-v
选项将输出存储在变量中,因此无需在此处使用命令替换

您的方法的问题是使用旧的背面标记。你可以做:

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

假设您使用的是
gnu-sed
作为
BSD-sed
将无法使用此方法。

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

以下是您尝试的错误之处:

sed命令是单引号,因此sed按原样获取
s/\\n/\n/g

整个命令都是反斜杠,因此应用了一轮反斜杠处理。这将导致sed获取代码
s/\n/\n/g
,而该代码不起任何作用

此代码的可能修复程序:

NEW_DESCR=`echo $EXT_DESCR | sed 's/\\\\n/\\n/g'`
通过加倍反斜杠,我们在sed中得到了正确的命令

或(更简单):

使用
$()
,而不是反勾号,后者的转义规则不那么深奥


注意:不要对shell变量使用
全大写
大写
是(非正式地)为系统变量(如
HOME
和特殊的内置变量(如
IFS
RANDOM
)保留的,您如何检查
新描述
?这对我来说很有用:
测试=$(echo“testing\n这个”| sed's/\\n/\n/g')&&echo“$test”<代码>考虑从后台返回到<代码> $()>代码>以捕获输出到变量。另见@Gunstick to的答案。总而言之:反勾号中的表达式(但不是
$()
)在执行之前已删除一定程度的引号。这是“如何将JSON字符串转换为纯文本”的XY问题吗?我不知道
%b
,很好的一个+1。谢谢!!参数扩展最初是我昨天开始时想做的,但我无法理解它!这太棒了!这是伟大的信息!最初我自己也在寻找参数扩展!我会包括,特别是对于
NEW_DESCR=$(echo "$EXT_DESCR" | sed 's/\\n/\n/g')
echo $EXT_DESCR | sed 's/\\n/\n/g'
NEW_DESCR=`echo $EXT_DESCR | sed 's/\\n/\n/g'`
NEW_DESCR=`echo $EXT_DESCR | sed 's/\\\\n/\\n/g'`
NEW_DESCR=$(echo $EXT_DESCR | sed 's/\\n/\n/g')