如何使用 tr REPEAT 修饰符将字符替换为重复字符?

wat*_*ery 4 shell text-processing tr

我正在使用该tr命令用另一个命令的输出中的制表符替换换行符,并且我希望有多个制表符以更好地将输出对齐到柱状格式。

我看到tr有一个[CHAR*REPEAT]选项,其中REPEAT可能是十进制或八进制值,但我无法让它工作,例如以下简单行:

echo "1234" | tr ['2'] ['x'*3]
Run Code Online (Sandbox Code Playgroud)

给出:

1x34
Run Code Online (Sandbox Code Playgroud)

虽然我期待:

1xxx34
Run Code Online (Sandbox Code Playgroud)

要使用的正确语法是什么?

Adm*_*Bee 8

恐怕您误解了“重复”选项的含义。

tr,正如您正确推断的那样,用于翻译字符集。你用选项调用它

tr set1  set2

这个想法是两个集合都可以包含多个字符,即你可以说

tr 'abc' 'def'
Run Code Online (Sandbox Code Playgroud)

它将取代每a一个d,每b有一个e,每c有一个f。现在,有时您想用相同的“输出”字符替换多个“输入”字符,例如

tr 'abcdefghij' 'xxxxxxxxyz'
Run Code Online (Sandbox Code Playgroud)

这将替换ahwith xiwithyjwith z。"repeat" 函数是为了让写这个不那么麻烦,这样你就可以写

tr 'abcdefghij' '[x*8]yz'
Run Code Online (Sandbox Code Playgroud)

作为速记。不幸的是,这意味着它不是为您打算做的事情而设计的。

相反,您可以尝试sed

$ echo "1234" | sed 's/2/xxx/g'
1xxx34
Run Code Online (Sandbox Code Playgroud)

这将替换 ( s) 的所有出现(尾随g2with xxx。由于sed比这更强大(查看标记为的问题以了解可能的内容),因此无论如何查看一下可能是个好主意。

  • `sed` 也有一个 `y/abc/xyz/` 来完成 `tr` 的工作,尽管它不支持 `tr'[:lower:]' '[:upper:]'` 和 co。不过,有些将 `\U`/`\u` 作为非标准扩展名。 (2认同)