Wie entferne ich doppelte Zeichen?

18

Wenn ich eine Zeile habe als:

Thhiisss iisss mmyyy nameeee

Ich möchte dies ausdrucken als:

This is my name

Was ist der Unix-Befehl dafür?

krishna
quelle
Können Sie einen weiteren Kontext zum Ursprung der Duplikate und der gewünschten Ausgabe angeben? Was ist, wenn "Mmyyy nameee iisss Jesssssiiieee"?
Paulo Almeida

Antworten:

24

Mit tr:

echo "Thhiisss iisss mmyyy nameeee" | tr -s 'a-z'

Erläuterung: Der -sSchalter tr"drückt" Zeichen wiederholen. Wie gezeigt, kann der Schalter mit einer Reihe von Zeichen verwendet werden: abis z.

mkc
quelle
2
Eine Erklärung des Befehls könnte für zukünftige Leser hilfreich sein.
Geek
8

Auf einem GNU-System müssen Sie sedo.ä. verwenden, wenn Ihr Gebietsschema Mehrbyte- Zeichen verwendet ( wie von Jimmy vorgeschlagen ), da GNU trnur auf ein Zeichen pro Byte verweisen kann. In einem ASCII-Gebietsschema können Sie alle Duplikate entfernen, die trwie folgt aussehen:

LC_ALL=C tr -s '\0-\255' <input

So...

echo Thhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '\0-\255'

... druckt ...

This is my name

Sie können dies auch selektiv tun, indem Sie sich nach Reichweite auf Ihre Ziele beziehen:

echo TThhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '\101-\132'

...oder...

echo TTTThhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '[:upper:]'

... welche das Gleiche sind und welche beide ausgeben:

Thhiisss iisss mmyyy nameeee

... oder Gebrauch [:punct:], [:digit:], [:lower:], [:alpha:]oder was auch immer Sie möchten. Sie können die Auswahl auch annullieren, wenn -c...

echo 'TTTThhiisss     iisss mmyyy nameeee' |
LC_ALL=C tr -cs '[:upper:]'

... druckt ...

TTTThis is my name
mikeserv
quelle
7

Ein Weg mit sed:

sed ':X;s/\(.\)\1/\1/g;tX'

oder noch einfacher:

sed 's/\(.\)\1*/\1/g'

(danke Costas und mikeserv für Kommentare).

jimmij
quelle
sed 's/\(.\)\1\+/\1/g'
Costas
3

Versuchen Sie tr:

echo "Thhiisss iisss mmyyy nameeee" | tr -s 'hismye'
heemayl
quelle