似乎无法在线找到答案...
我有一个字符串变量(外部来源),其中新行"\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"
答案 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})和特殊的内置变量(例如IFS
或RANDOM
)。
答案 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 启用反斜杠转义的解释