显示包含 \n 并带有换行符的 stdout

显示包含 \n 并带有换行符的 stdout

可执行文件 (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

答案1

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

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

%

答案2

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

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

… | sed 's/\\n/\n/g; s/\\t/ /; s/\\\(.\)/\1/g'

中的空格s/\\t/ /是制表符。 GNU sed 让您可以编写s/\\t/\t/.

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

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

答案3

下面是用 awk 做你想做的事情所需要的。鉴于此输入:

$ printf '%s\n' 'abc\\ndef\nghi'
abc\\ndef\nghi

请注意,第一个本身\n是转义的,因此应按字面意思处理\\n。以下是获得预期输出的方法:

$ printf '%s\n' 'abc\\ndef\nghi' |
    awk '{gsub(/@/,"@A"); gsub(/\\\\/,"@B"); gsub(/\\n/,"\n"); gsub(/@B/,"\\\\"); gsub(/@A/,"@")}1'
abc\\ndef
ghi

如果您也希望解释其他转义序列,例如\t,您可以在 for 后面为每个转义序列添加一个单独的 gsub() \n,例如:

awk '{
    gsub(/@/,"@A"); gsub(/\\\\/,"@B")
    gsub(/\\n/,"\n")
    gsub(/\\t/,"\t")
    gsub(/@B/,"\\\\"); gsub(/@A/,"@")
}1'

前 2 个和最后 2 个 gsub() 正在创建一个唯一的 string @B,将对映射\\到它以使它们不受影响,然后在完成预期的转换后将它们映射回来。

答案4

足够简单: echo -e "tCL\n1523 memo\n"

man echo

-e enable interpretation of backslash escapes

相关内容