Come rimuovere i caratteri duplicati?


18

Se sto avendo una linea come:

Thhiisss iisss mmyyy nameeee

Voglio stampare questo come:

This is my name

Qual è il comando unix per questo?


Potete fornire qualche ulteriore contesto sull'origine delle duplicazioni e sull'output desiderato? E se "Mmyyy nameee iisss Jesssssiiieee"?
Paulo Almeida,

Risposte:


24

Con tr:

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

Spiegazione: L' -sinterruttore di tr"stringe" ripete i caratteri. Come mostrato, l'interruttore può essere utilizzato con una gamma di caratteri: aa z.


2
alcune spiegazioni per il comando potrebbero essere utili per i futuri lettori.
Geek

8

Su un sistema GNU dovrai usare sedo simili se la tua locale usa caratteri multibyte ( come suggerisce jimmij ) perché GNU trpuò fare riferimento solo a un carattere per byte. In una locale ASCII è possibile rimuovere tutti i duplicati con tr:

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

Così...

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

... stampe ...

This is my name

Puoi anche farlo in modo selettivo facendo riferimento ai tuoi obiettivi per intervallo:

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

...o...

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

... che risultano essere la stessa cosa e che entrambi stampano:

Thhiisss iisss mmyyy nameeee

... o l'uso [:punct:], [:digit:], [:lower:], [:alpha:]o qualsiasi altra cosa che si desidera. Puoi anche annullare la selezione con -c...

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

... stampe ...

TTTThis is my name

7

Un modo con sed:

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

o anche più semplice:

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

(grazie Costas e mikeserv per i commenti).


sed 's/\(.\)\1\+/\1/g'
Costas,

3

Prova tr:

echo "Thhiisss iisss mmyyy nameeee" | tr -s 'hismye'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.