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