Ist es möglich, Duplikate eines Zeichens mit tr durch ein Zeichen zu ersetzen?

7

Ich versuche, alle Vorkommen von # zu nehmen und wenn sie aufeinanderfolgend sind, ersetzen Sie sie durch nur ein #.

z.B

 ab ### cde fghi## jklm

würde werden:

ab # cde, fghi# jklm

Mein ursprüngliches Ziel war es, alle aufeinander folgenden Ziffern durch # so zu ersetzen. 120 -> # und 3 -> #. Ich fand jedoch, dass 120 -> ###. Jetzt habe ich dieses neue Problem.

user652437
quelle

Antworten:

20

Verwenden von tr -s:

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

-s Drücken Sie mehrere Vorkommen der im letzten Operanden aufgeführten Zeichen (entweder Zeichenfolge1 oder Zeichenfolge2) in der Eingabe in eine einzelne Instanz des Zeichens. Dies geschieht, nachdem alle Lösch- und Übersetzungsarbeiten abgeschlossen sind.


Ihr ursprüngliches Problem hätte gelöst werden können mit:

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

Oder POSIXly:

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

Oder:

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