Stack Overflow 上的以下答案,
强加一种合理的方式POSIX-ly 重复单个字符,如下所示。在此示例中,我们使用等号 100 次:
printf %100s | tr " " "="
我的问题是我不明白它是如何工作的,我更喜欢一个简单的解释。请不要发表类似评论阅读手册,我这样做了,因为我对此并不聪明,所以我问这个问题,因为我从未使用过tr
,也没有见过这样的printf
说法。
答案1
简而言之,printf %100s
将打印 100 个空格,并将tr " " "="
这些空格转换为等号,从而有效地打印 100 个等号。
分解一下:
printf
是一个内置的外壳。它通常需要两个或多个参数,第一个参数是“格式字符串”,其余参数将用于填充该格式字符串中的占位符。一旦该模板完全填充,它将打印出结果。如果还有更多参数,它将重新开始,填充更多参数并打印结果字符串。
用于的格式字符串采用格式规范,以单个字母printf
开头和结尾,因此表示整数(使用十进制基数,因此为“d”),表示浮点数,表示字符串。后面除字母以外的字符是格式规范的修饰符,特别是数字用于指定输出时字段的请求长度。因此,会将字符串格式化为至少有 100 个字符,它将用空格填充并保持右对齐(换句话说,在字符串的开头添加空格。)%
%d
%f
%s
%
%100s
如果传递一个额外的参数,它将用于该%s
字段,例如printf %100s abc
将打印 97 个空格(考虑到“abc”中的 3 个,总共 100 个空格),后跟实际的字符串“abc”。但是如果没有给出参数,那么格式规范将填充一个空或 null 参数(对于%s
,它是一个空字符串,对于 ,它将是 0%d
等),所以这与传递一个空字符串是一样的,例如printf %100s ''
。最终结果是只打印 100 个字符的填充。
因此,将所有内容放在一起,printf %100s
会打印出 100 个空格。
Nowtr
是一个将字符从输入转换为输出的工具。它采用两个参数 SET1 和 SET2,每个参数一组字符,然后将 SET1 的第一个字符转换为 SET2 的第一个字符,将 SET1 的第二个字符转换为 SET2 的第二个字符,依此类推。tr
从 stdin 读取其输入并将其写回 stdout (因此它在像上面这样的管道中非常有用。)tr
将始终翻译给定字符串中该字符的所有出现位置。
例如,tr aeiou 12345
会将小写元音按顺序翻译为数字 1 到 5,因此它将把“queueing”翻译为“q52523ng”。您还可以向其传递字符范围,例如tr a-z A-Z
将任何小写字母转换为相应的大写字母。
因此,tr " " "="
只需将整个字符串中的空格转换为等号即可。第一个空格需要被引用才能被识别为参数。=
实际上并不需要被引用,但这样做并没有什么坏处。tr " " =
会起到同样的作用。
将它们放在一起,打印 100 个空格,然后将每个空格翻译成等号。
希望这能足够详细地解释它,但如果您还有不明白的地方,请发表评论,我会尽力解决。
答案2
该printf
命令使用它的第一个参数作为一种格式用于打印其后续参数。printf %100s
打印出其参数,并使用空格(在左侧)填充到 100 个字符宽。没有为 format 提供参数,因此它格式化空字符串一次,并输出 100 个空格。你可以看到:
$ printf %100s | hexdump -C
00000000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
*
00000064
(20 是空格的十六进制;*
表示重复上一行)
格式字符串大约使用 CXprintf
说明符:%
、用于适应格式化值的可选宽度以及要使用的格式类型。s
是字符串格式,字符串默认在左侧填充空格。可能有多种格式,或其他文字部分:printf "a%10sb\n" hello
打印
a xb.
tr
用选定的替换内容替换标准输入中选定的字符,并将结果打印到其标准输出。tr " " "="
有一个要替换的字符 - 空格 - 和一个要替换的字符 - 等号。因此,它将输入中的每个空格都转换为=
,而其余部分保持不变。你也可以尝试一下:
$ tr " " "="
hello world
hello=world
(我输入了“hello world”)
您可以进行多次替换:tr abc def
将 a 变为 d,将 b 变为 e,将 c 变为 f,其余部分保持不变。这里它只是一个字符,因为这是printf
可以廉价生成的。
管道|
原因左侧命令的输出printf %100s
,用作右侧命令 的输入tr " " "="
。即给 连续一百个空格tr
,每一个空格都替换为=
, 并打印出新的字符串。
printf %100s | tr " " "="
====================================================================================================