标签: printf

如何使用转义序列打印控制字符?

我已经使用 tput 定义了红色

red=$(tput setaf 1)
Run Code Online (Sandbox Code Playgroud)

为我的程序中的警告着色。这工作正常:

printf '%sfail\n' "$red"
# prints 'fail' in red
Run Code Online (Sandbox Code Playgroud)

但有一次我想按原样打印出转义序列,例如:

\E[31mfail

我该怎么做?我知道 printf 有一个%q标志,但它逃脱了我不想的其他东西。

shell escape-characters printf

9
推荐指数
2
解决办法
8436
查看次数

如何在目录中的所有文件前添加一行?

我有一个名为backup文件扩展名的目录*.sql。我想要做的是在目录中的所有 sql 文件前添加一行backup

我做了echo 'use my_db;' >> backup/*.sql,这没有用。

我尝试了以下但不知道下一步该怎么做:

ls backup/*.sql | xargs echo "use my_db;"
Run Code Online (Sandbox Code Playgroud)

任何解决方案要前置一个行?

sed printf

9
推荐指数
2
解决办法
9041
查看次数

需要解释如何在 POSIX shell 中重复一个字符

Stack Overflow 上的以下答案,

如何在 bash 中重复一个字符?

强加了一种合理的POSIX方式-ly 重复单个字符,如下所示。在这个例子中,让我们使用等号 100 次:

printf %100s | tr " " "="
Run Code Online (Sandbox Code Playgroud)

我的问题是我不明白它是如何工作的,我更喜欢简单的解释。请不要像阅读手册那样发表评论,我这样做了,因为我不聪明,所以我问这个问题,因为我从未使用过tr,也没有见过这样的printf声明。

shell posix tr printf

9
推荐指数
2
解决办法
1781
查看次数

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

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

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

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

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

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

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

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

shell posix printf

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

人类可读的文件大小与 find 的 printf

我正在编写一个简单的辅助函数,以我想要的格式显示特定文件夹:

find . -maxdepth 1 -not -name "." -printf '[%TY-%Tm-%Td]\t%s\t%f\n' | sort -n
Run Code Online (Sandbox Code Playgroud)

但是我想以更好的格式显示文件大小。我找到了这个答案,我用它来创建一个名为 .bash 的 bash 函数hr

user@host:~$ hr 12345
12M
Run Code Online (Sandbox Code Playgroud)

我尝试在find通话中使用它,如下所示:

find . -maxdepth 1 -not -name "." -printf '[%TY-%Tm-%Td]\t'$(hr %s)'\t%f\n' | sort -n
Run Code Online (Sandbox Code Playgroud)

但它仍然继续显示完整的文件大小。我应该如何修改它以使其按预期工作?

bash find printf

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

`scanf` 实现源代码在哪里?

我想找到scanf在 Linux 机器上实现的C 源代码。谷歌搜索找到scanf实现并没有告诉我找到它的方法。我试图gcc使用ctagsand从源代码树中找到该源代码cscope,但我找不到它。谁能告诉我scanf函数定义在哪里,即实现源代码?

c source printf

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

printf 的奇怪浮点舍入行为

我在这个网站上阅读了一些答案,发现printf四舍五入是可取的。

然而,当我在实践中使用它时,一个微妙的错误导致我出现以下行为:

$ echo 197.5 | xargs printf '%.0f'
198
$ echo 196.5 | xargs printf '%.0f'
196
$ echo 195.5 | xargs printf '%.0f'
196
Run Code Online (Sandbox Code Playgroud)

请注意,四舍五入196.5变为196

我知道这可能是一些微妙的浮点错误(但这不是一个很大的数字,嗯?),所以有人可以对此有所了解吗?

对此的解决方法也非常受欢迎(因为我现在正在尝试将其付诸实践)。

bash shell-script math floating-point printf

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

Bash:如何使用 $RANDOM 生成随机浮点数

是否可以使用整数随机生成器 $RANDOM 生成具有特定精度和特定范围的真实随机数?例如,我们如何生成介于 0 和 1 之间的 4 个精度的实数?

0.1234
0.0309
0.9001
0.0000
1.0000
Run Code Online (Sandbox Code Playgroud)

一个简单的解决方法:

printf "%d04.%d04\n" $RANDOM $RANDOM
Run Code Online (Sandbox Code Playgroud)

shell bash random numeric-data printf

8
推荐指数
3
解决办法
1万
查看次数

使用 printf 重复一个字符并在末尾附加换行符

为了重复一个字符 N 次,我们可以使用printf. 例如,要重复@20 次,我们可以使用这样的方法:

N=20
printf '@%.0s' $(seq 1 $N)
Run Code Online (Sandbox Code Playgroud)

输出:

@@@@@@@@@@@@@@@@@@@@
Run Code Online (Sandbox Code Playgroud)

但是,该字符串的末尾没有换行符。我试过将输出管道传输到sed

printf '@%.0s' $(seq 1 $N) | sed '$s/$/\n/'
Run Code Online (Sandbox Code Playgroud)

是否可以printf在不使用 sed 的情况下通过单个(在输出末尾添加换行符)获得相同的结果?

sed printf

8
推荐指数
3
解决办法
1852
查看次数

给定一些 ASCII 数字,使用 `printf` 输出字符

我一直在尝试printf输出一些字符,给定它们的 ASCII 数字(十六进制)......像这样:

#!/bin/bash

hexchars () { printf '\x%s' $@ ;}

hexchars 48 65 6c 6c 6f

Expected output:
Hello
Run Code Online (Sandbox Code Playgroud)

出于某种原因,这不起作用。有任何想法吗?

编辑:

根据 Isaac 提供的答案(接受的答案),我最终得到了这个函数:

chr  () { local var ; printf -v var '\\x%x' $@ ; printf "$var" ;}
Run Code Online (Sandbox Code Playgroud)

请注意,为了通过避免使用子shell来提高速度,我稍微改写了他的答案。

Result:

~# chr 0x48 0x65 0x6c 0x6c 0x6f
Hello
~# chr 72 101 108 108 111
Hello
~# chr {32..126}
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
Run Code Online (Sandbox Code Playgroud)

我猜这个chr函数的反函数应该是一个像...

asc () { printf '%d\n' "'$1"  ;}
asc A
65
chr 65
A …
Run Code Online (Sandbox Code Playgroud)

bash printf

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