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



似乎在网上找不到这个问题的答案......

我有一个字符串变量(外部来源(,其中包含新行"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_UPPERCASEUPPERCASE(非正式地(保留给系统变量(如HOME(和特殊的内置变量,如IFSRANDOM

取决于你需要它的具体用途:

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不适用于此方法。

最新更新