BASH:unescape字符串

时间:2017-11-29 23:09:24

标签: bash

假设我有以下字符串:

"some\nstring\n..."

当它在bash中被捕时它显示为一行。此外,

string_from_pipe | sed 's/\\\\/\\/g' # does not work
| awk '{print $0}'
| awk '{s = $0; print s}'
| awk '{s = $0; printf "%s",s}'
| echo $0  
| sed 's/\\(.)/\1/g'
# all have not worked. 

如何取消此字符串以使其打印为:

some
string

甚至在文件中以这种方式显示?

4 个答案:

答案 0 :(得分:3)

正如您所观察到的,echo无法解决问题:

$ s="some\nstring\n..."
$ echo "$s"
some\nstring\n...

你还没有提到你在哪里获得该字符串或其中有哪些转义。

使用bash

如果转义符是printf支持的转义符,请尝试:

$ printf "$s\n"
some
string
...

使用sed

$ echo "$s" | sed 's/\\n/\n/g'
some
string
...

使用awk

$ echo "$s" | awk '{gsub(/\\n/, "\n")} 1'
some
string
...

答案 1 :(得分:3)

POSIX sh provides printf %b就是为了这个目的:

s='some\nstring\n...'
printf '%b\n' "$s"

...将发出:

some
string
...

更重要的是,the POSIX spec for echo的“应用程序使用”部分明确建议使用printf %b来实现此目的,而不是依赖于可选的XSI扩展。

答案 2 :(得分:1)

如果变量中包含字符串(例如myvar),则可以使用:

${myvar//\\n/$'\n'}

例如:

$ myvar='hello\nworld\nfoo'
$ echo "${myvar//\\n/$'\n'}"
hello
world
foo
$ 

(注意:如果您无法完全控制printf %s <string>的内容,使用echo <string>通常比<string>更安全。)

答案 3 :(得分:1)

如何使用-e的{​​{1}}选项?

echo

$ s="some\nstring\n..." && echo -e "$s" some string ... man-page

echo