我想澄清一下,我不是在谈论如何在解释的 shell 级别上转义字符。
据我所知,只需要转义两个字符:%
和\
要打印文字%
,您必须使用前面的 将其转义%
:
printf '%%'
Run Code Online (Sandbox Code Playgroud)
要打印文字,\
您必须使用前面的 将其转义\
:
printf '\\'
Run Code Online (Sandbox Code Playgroud)
是否有任何其他情况我需要转义字符才能按字面意思解释?
当尝试格式化printf
包含多字节字符的字符串的输出时,很明显printf
不计算文字字符而是字节数,如果混合单字节和多字节字符,这会使格式化文本变得困难。例如:
$ cat script
#!/bin/bash
declare -a a b
a+=("0")
a+=("00")
a+=("000")
a+=("0000")
a+=("00000")
b+=("0")
b+=("??00")
b+=("??000")
b+=("??0000")
b+=("??00000")
printf "%-15s|\n" "${a[@]}" "${b[@]}"
$ ./script
0 |
00 |
000 |
0000 |
00000 |
0 |
??00 |
??000 |
??0000 |
??00000 |
Run Code Online (Sandbox Code Playgroud)
我发现了各种建议的解决方法(主要是使用另一种语言或实用程序来打印文本的包装器)。是否有任何本机 bash 解决方案?任何记录的printf
格式字符串似乎都没有帮助。locale
在这种情况下,这些设置是否相关,例如,使用像 UTF-32 这样的固定宽度字符编码?
尝试以下输出|\xc3\x9c| X|
:
echo \'\xc3\x9c X\' | awk \'{printf("|% 2s|% 2s|\\n", $1, $2)}\'\n
Run Code Online (Sandbox Code Playgroud)\n显然awk
计算的是字节长度,而不是 的字符长度\xc3\x9c
,因此计数为 2,并且不需要用空格进行左填充,就像 一样X
。
是否可以awk
在计算模式字符长度%<count>s
printf
而不是字节长度的模式下运行?
\'s也存在同样的bash
printf
问题。我希望答案不一样:“passthrough to libc printf”:-/
我没有使用,但是Ubuntu\xc2\xa022.04 (Jammy Jellyfish) 已经为我安装了gawk
任何版本。我没想到这些天可以安装任何东西:-/gawk
printf "%*s\n" $(((${#fname}+$COLUMNS)/2)) "$fname"
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
line 9: (7+)/2: syntax error: operand expected (error token is ")/2")
Run Code Online (Sandbox Code Playgroud)
这在终端中有效,但在我的脚本中无效。你有什么想法?