我已经使用 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标志,但它逃脱了我不想的其他东西。
我有一个名为backup文件扩展名的目录*.sql。我想要做的是在目录中的所有 sql 文件前添加一行backup。
我做了echo 'use my_db;' >> backup/*.sql,这没有用。
我尝试了以下但不知道下一步该怎么做:
ls backup/*.sql | xargs echo "use my_db;"
Run Code Online (Sandbox Code Playgroud)
任何解决方案要前置一个行?
Stack Overflow 上的以下答案,
强加了一种合理的POSIX方式-ly 重复单个字符,如下所示。在这个例子中,让我们使用等号 100 次:
printf %100s | tr " " "="
Run Code Online (Sandbox Code Playgroud)
我的问题是我不明白它是如何工作的,我更喜欢简单的解释。请不要像阅读手册那样发表评论,我这样做了,因为我不聪明,所以我问这个问题,因为我从未使用过tr,也没有见过这样的printf声明。
我想澄清一下,我不是在谈论如何在解释的 shell 级别上转义字符。
据我所知,只需要转义两个字符:%和\
要打印文字%,您必须使用前面的 将其转义%:
printf '%%'
Run Code Online (Sandbox Code Playgroud)
要打印文字,\您必须使用前面的 将其转义\:
printf '\\'
Run Code Online (Sandbox Code Playgroud)
是否有任何其他情况我需要转义字符才能按字面意思解释?
我正在编写一个简单的辅助函数,以我想要的格式显示特定文件夹:
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)
但它仍然继续显示完整的文件大小。我应该如何修改它以使其按预期工作?
我想找到scanf在 Linux 机器上实现的C 源代码。谷歌搜索找到scanf实现并没有告诉我找到它的方法。我试图gcc使用ctagsand从源代码树中找到该源代码cscope,但我找不到它。谁能告诉我scanf函数定义在哪里,即实现源代码?
我在这个网站上阅读了一些答案,发现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。
我知道这可能是一些微妙的浮点错误(但这不是一个很大的数字,嗯?),所以有人可以对此有所了解吗?
对此的解决方法也非常受欢迎(因为我现在正在尝试将其付诸实践)。
是否可以使用整数随机生成器 $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) 为了重复一个字符 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 的情况下通过单个(在输出末尾添加换行符)获得相同的结果?
我一直在尝试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)