相关疑难解决方法(0)

使用 printf 命令时需要转义哪些字符?

我想澄清一下,我不是在谈论如何在解释的 shell 级别上转义字符。

据我所知,只需要转义两个字符:%\

要打印文字%,您必须使用前面的 将其转义%

printf '%%'
Run Code Online (Sandbox Code Playgroud)

要打印文字,\您必须使用前面的 将其转义\

printf '\\'
Run Code Online (Sandbox Code Playgroud)

是否有任何其他情况我需要转义字符才能按字面意思解释?

shell posix printf

9
推荐指数
1
解决办法
9682
查看次数

printf:多字节字符

当尝试格式化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 这样的固定宽度字符编码?

bash character-encoding printf

6
推荐指数
1
解决办法
2621
查看次数

是否可以告诉 awk 计算 '%10s' printf 格式的字符串长度而不是字节字符串长度?

尝试以下输出|\xc3\x9c| X|

\n
echo \'\xc3\x9c X\' | awk \'{printf("|% 2s|% 2s|\\n", $1, $2)}\'\n
Run Code Online (Sandbox Code Playgroud)\n

显然awk计算的是字节长度,而不是 的字符长度\xc3\x9c,因此计数为 2,并且不需要用空格进行左填充,就像 一样X

\n

是否可以awk在计算模式字符长度%<count>s printf而不是字节长度的模式下运行?

\n

\'s也存在同样的bashprintf问题。我希望答案不一样:“passthrough to libc printf”:-/

\n

没有使用,但是Ubuntu\xc2\xa022.04 (Jammy Jellyfish) 已经为我安装了gawk任何版本。我没想到这些天可以安装任何东西:-/gawk

\n

character-encoding awk unicode

2
推荐指数
1
解决办法
278
查看次数

使用 printf 将文本居中

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)

这在终端中有效,但在我的脚本中无效。你有什么想法?

bash printf text-formatting

1
推荐指数
1
解决办法
1149
查看次数