用换行符显示包含 \n 的标准输出

SOU*_*ser 6 bash echo newlines

可执行文件 (cURL) 的输出包含 \n。如何用换行符显示这样的输出?

假设一个可执行文件的输出是tCL\n1523 memo\n,管道到 printf 不显示换行符。

$ echo "tCL\n1523 memo\n"
tCL\n1523 memo\n
$
$ printf "tCL\n1523 memo\n"
tCL
1523 memo
$
$ echo "tCL\n1523 memo\n" | xargs -0 printf '%s'
tCL\n1523 memo\n
$
$ echo "tCL\n1523 memo\n" | awk '{ printf "%s", $0 }
tCL\n1523 memo\n
Run Code Online (Sandbox Code Playgroud)

mur*_*uru 5

%s不解释转义序列。你需要%b

% echo 'tCL\n1523 memo\n' | xargs -0 printf "%b"
tCL
1523 memo

%
Run Code Online (Sandbox Code Playgroud)

  • 好一个!我仍然认为命令替换会比 xargs 更好,不是吗? (2认同)
  • 我刚刚添加了笨拙的解决方法 - https://unix.stackexchange.com/a/534944/133219。 (2认同)

Gil*_*il' 5

您可能还需要将双反斜杠转换为反斜杠,否则输入格式将不明确。

您可以编写一个 sed 脚本来翻译反斜杠字母转义。此脚本仅转换它识别的转义序列,否则会删除反斜杠。我已经支持换行符和制表符。

… | sed 's/\\n/\n/g; s/\\t/ /; s/\\\(.\)/\1/g'
Run Code Online (Sandbox Code Playgroud)

中的空格s/\\t/ /是制表符。GNU sed 允许您编写s/\\t/\t/.

如果您还需要八进制转义,请使用更高级的工具,例如 Perl。你可以让它解析它支持的所有转义序列。

… | perl -pe 's/\\([0-7]{1,3}|c.|[oxN]\{[^{}]+\}|.)/"\"\\${1}\""/eeg'
Run Code Online (Sandbox Code Playgroud)