是否可以使用 tr 用一个字符替换一个字符的重复项

use*_*437 7 linux text-processing replace tr

我正在尝试获取所有出现的 #,如果它们是连续的,则只用一个 # 替换它们。

例如

 ab ### cde fghi## jklm
Run Code Online (Sandbox Code Playgroud)

会成为:

ab # cde, fghi# jklm
Run Code Online (Sandbox Code Playgroud)

我最初的目标是用 # so 替换所有连续的数字;120 -> # 和 3->#。但是我发现 120->###。所以现在我留下了这个新问题。

jes*_*e_b 20

使用tr -s

$ echo 'ab ### cde fghi## jklm' | tr -s '#'
ab # cde fghi# jklm
Run Code Online (Sandbox Code Playgroud)

-s 将输入中最后一个操作数(string1 或 string2)中列出的多个字符压缩到单个字符实例中。这是在所有删除和翻译完成后发生的。


您原来的问题可以通过以下方式解决:

sed -E 's/[0-9]+/#/g'
Run Code Online (Sandbox Code Playgroud)

或者POSIXly:

sed 's/[[:digit:]]\{1,\}/#/g'
Run Code Online (Sandbox Code Playgroud)

或者:

tr -s '[:digit:]' '[#*]'
Run Code Online (Sandbox Code Playgroud)