¿Cómo eliminar caracteres duplicados?


18

Si estoy teniendo una línea como:

Thhiisss iisss mmyyy nameeee

Quiero imprimir esto como:

This is my name

¿Cuál es el comando unix para esto?


¿Puede proporcionar más contexto sobre el origen de las duplicaciones y la salida deseada? ¿Qué pasa si "Mmyyy nameee iisss Jesssssiiieee"?
Paulo Almeida

Respuestas:


24

Con tr:

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

Explicación: El -scambio de tr"apretar" caracteres de repetición. Como se muestra, el interruptor se puede usar con una variedad de caracteres: aa z.


2
alguna explicación para el comando podría ser útil para futuros lectores.
Geek

8

En un sistema GNU, deberá usar sedo similar si su entorno local utiliza caracteres multibyte ( como sugiere jimmij ) porque GNU trsolo puede hacer referencia a un carácter por byte. En un escenario ASCII puede eliminar todos los duplicados w / trcomo:

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

Entonces...

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

...huellas dactilares...

This is my name

También puedes hacerlo de forma selectiva haciendo referencia a tus objetivos por rango:

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

...o...

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

... que resultan ser lo mismo, y que ambos imprimen:

Thhiisss iisss mmyyy nameeee

... o uso [:punct:], [:digit:], [:lower:], [:alpha:]o lo que le gustaría. También puede negar la selección con -c...

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

...huellas dactilares...

TTTThis is my name

7

Unidireccional con sed:

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

o incluso más simple:

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

(gracias Costas y mikeserv por los comentarios).


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

3

Prueba tr:

echo "Thhiisss iisss mmyyy nameeee" | tr -s 'hismye'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.