[英]Replace string '\n' (not 'end of line') in bash script
[英]How to replace “\n” string with a new line in Unix Bash script
似乎无法在网上找到这个答案...
我有一个字符串变量(外部源),新行"\\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"
使用参数扩展不需要sed
:
$ foo='1\n2\n3'; echo "${foo//'\n'/$'\n'}"
1
2
3
使用bash 4.4
或更新版本,您可以在${parameter@operator}
使用E
运算${parameter@operator}
:
$ foo='1\n2\n3'; 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')
而不是反引号使用$( )
,它具有较少深奥的逃避规则。
注意:不要将ALL_UPPERCASE
用于shell变量。 UPPERCASE
(非正式地)保留用于系统变量,例如HOME
和特殊的内置变量,例如IFS
或RANDOM
。
这个printf
可以通过解释所有转义的构造来完成工作:
printf -v NEW_DESCR "%b" "$EXT_DESCR"
-v
选项将输出存储在变量中,因此不需要在此处使用命令替换。
你的方法的问题是使用旧的后退。 你可以这样做:
NEW_DESCR=$(echo "$EXT_DESCR" | sed 's/\\n/\n/g')
假设您正在使用gnu sed
作为BSD sed
将无法使用此方法。
具体取决于您需要它:
echo -e $EXT_DESCR
可能就是你所需要的一切。
来自echo手册页:
-e启用反斜杠转义的解释
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.