【问题标题】:How to replace "\n" string with a new line in Unix Bash script如何在 Unix Bash 脚本中用新行替换“\n”字符串
【发布时间】:2018-08-28 19:29:36
【问题描述】:

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

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

【问题讨论】:

  • 你如何检查NEW_DESCR
  • 这对我有用:test=$(echo "testing\nthis" | sed 's/\\n/\n/g') && echo "$test" 考虑从反引号切换到 $() 以将输出捕获到变量。
  • @JNevill 的评论指出了问题所在。另请参阅@Gunstick 对Backticks vs braces in Bash 的回答。总之:反引号内的表达式(但不是$())在执行之前会删除一定程度的引号。
  • 这是一个关于“如何将 JSON 字符串转换为纯文本?”的 XY 问题

标签: bash shell variables unix


【解决方案1】:

不需要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

【讨论】:

  • 谢谢!!参数扩展本来是我昨天开始的时候想做的,但是想不通!这太棒了!
【解决方案2】:

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

你的尝试有什么问题:

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)和特殊的内置变量(例如IFSRANDOM)保留。

【讨论】:

【解决方案3】:

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

printf -v NEW_DESCR "%b" "$EXT_DESCR"

-v 选项会将输出存储在一个变量中,因此此处无需使用命令替换。

您的方法的问题是使用旧的反引号。你可以这样做:

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

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

【讨论】:

  • 我不知道%b,不错+1。
【解决方案4】:

取决于你到底需要什么:

echo -e $EXT_DESCR

可能就是你所需要的。

来自 echo 手册页:

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

【讨论】:

    猜你喜欢
    • 2020-07-23
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多