假设我有以下字符串:
"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
甚至在文件中以这种方式显示?
答案 0 :(得分:3)
正如您所观察到的,echo
无法解决问题:
$ s="some\nstring\n..."
$ echo "$s"
some\nstring\n...
你还没有提到你在哪里获得该字符串或其中有哪些转义。
如果转义符是printf
支持的转义符,请尝试:
$ printf "$s\n"
some
string
...
$ echo "$s" | sed 's/\\n/\n/g'
some
string
...
$ 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)