假设我有以下字符串:
"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 扩展。
正如您所观察到的,echo并没有解决问题:
$ s="some\nstring\n..."
$ echo "$s"
some\nstring\n...
Run Code Online (Sandbox Code Playgroud)
您没有提到您从哪里获得该字符串或其中包含哪些转义符。
printf如果转义符受 支持printf,则尝试:
$ printf '%b\n' "$s"
some
string
...
Run Code Online (Sandbox Code Playgroud)
$ echo "$s" | sed 's/\\n/\n/g'
some
string
...
Run Code Online (Sandbox Code Playgroud)
$ echo "$s" | awk '{gsub(/\\n/, "\n")} 1'
some
string
...
Run Code Online (Sandbox Code Playgroud)