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

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

Stack Overflow 上的以下答案,

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

强加一种合理的方式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 " " "="
====================================================================================================

相关内容