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

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

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

例如

 ab ### cde fghi## jklm

会成为:

ab # cde, fghi# jklm

我最初的目标是将所有连续数字替换为 # so; 120 -> # 和 3->#。然而我发现120->###。所以现在我面临这个新问题。

答案1

使用tr -s

$ echo 'ab ### cde fghi## jklm' | tr -s '#'
ab # cde fghi# jklm

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


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

sed -E 's/[0-9]+/#/g'

或者 POSIXly:

sed 's/[[:digit:]]\{1,\}/#/g'

或者:

tr -s '[:digit:]' '[#*]'

相关内容