trを使用して重複した文字を文字に置き換えることはできますか?

trを使用して重複した文字を文字に置き換えることはできますか?

#のすべてのアイテムをインポートし、連続した場合は1つだけ#に置き換えようとします。

例えば

 ab ### cde fghi## jklm

になります:

ab # cde, fghi# jklm

私の最初の目標は、すべての連続番号を#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'

またはPOSIXとして:

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

または:

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

関連情報