似乎在网上找不到这个问题的答案......
我有一个字符串变量(外部来源(,其中包含新行"n"
编码为字符串。
我想用实际的新行回车符替换这些字符串。 下面的代码可以实现这一点...
echo $EXT_DESCR | sed 's/\n/n/g'
但是当我尝试将其结果存储到它自己的变量中时,它会将它们转换回字符串
NEW_DESCR=`echo $EXT_DESCR | sed 's/\n/n/g'`
如何做到这一点,或者我做错了什么?
这是我一直在测试的代码,试图获得正确的结果
EXT_DESCR="This is a textnWith 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"
无需sed
,使用参数扩展:
$ foo='1n2n3'; echo "${foo//'n'/$'n'}"
1
2
3
对于bash 4.4
或更高版本,您可以在${parameter@operator}
中使用E
运算符:
$ foo='1n2n3'; echo "${foo@E}"
1
2
3
其他答案包含替代解决方案。(我特别喜欢参数扩展的那个。
以下是您的尝试的错误之处:
在
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')
代替反引号使用$( )
,它有较少深奥的转义规则。
注意:不要对 shell 变量使用ALL_UPPERCASE
。UPPERCASE
(非正式地(保留给系统变量(如HOME
(和特殊的内置变量,如IFS
或RANDOM
。
取决于你需要它的具体用途:
echo -e $EXT_DESCR
可能就是你所需要的。
从回显手册页:
-e 启用反斜杠转义的解释
此printf
将通过解释所有转义结构来完成这项工作:
printf -v NEW_DESCR "%b" "$EXT_DESCR"
-v
选项将输出存储在变量中,因此无需在此处使用命令替换。
您的方法的问题在于使用旧的反勾号。你可以做:
NEW_DESCR=$(echo "$EXT_DESCR" | sed 's/\n/n/g')
假设您使用的是gnu sed
,因为BSD sed
不适用于此方法。