BASH:转义字符串

don*_*lan 12 bash

假设我有以下字符串:

"some\nstring\n..."
Run Code Online (Sandbox Code Playgroud)

当在 bash 中 catted 时,它显示为一行。更远,

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. 
Run Code Online (Sandbox Code Playgroud)

我如何取消转义这个字符串,使其打印为:

some
string
Run Code Online (Sandbox Code Playgroud)

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

Cha*_*ffy 14

POSIX正是为此目的而sh 提供printf %b的:

s='some\nstring\n...'
printf '%b\n' "$s"
Run Code Online (Sandbox Code Playgroud)

...会发出:

some
string
...
Run Code Online (Sandbox Code Playgroud)

更重要的是,POSIX 规范echo的 APPLICATION USAGE 部分明确建议printf %b为此目的使用,而不是依赖可选的 XSI 扩展。

  • @donlan“稳定”,因为它的输出不会意外改变?是的。“正确”,因为它在每行输入上运行 `printf '%b\n'` 转换,而不首先修改该输入?否。请参阅 https://ideone.com/2QzTIa 给出的示例,显示使用 `xargs` 调用 `printf '%b\n'` 的不同方法;只有使用 `xargs -0` 或 `xargs -d $'\n'` 的输出才有正确的输出。 (2认同)

Joh*_*024 5

正如您所观察到的,echo并没有解决问题:

$ s="some\nstring\n..."
$ echo "$s"
some\nstring\n...
Run Code Online (Sandbox Code Playgroud)

您没有提到您从哪里获得该字符串或其中包含哪些转义符。

使用符合 POSIX 标准的 shellprintf

如果转义符受 支持printf,则尝试:

$ printf '%b\n' "$s"
some
string
...
Run Code Online (Sandbox Code Playgroud)

使用 sed

$ echo "$s" | sed 's/\\n/\n/g'
some
string
...
Run Code Online (Sandbox Code Playgroud)

使用 awk

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