Como remover caracteres duplicados?

17

Se eu estou tendo uma linha como:

Thhiisss iisss mmyyy nameeee

Eu quero imprimir isso como:

This is my name

Qual é o comando unix para isso?

    
por krishna 26.02.2015 / 19:04

4 respostas

23

com tr :

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

Explicação: A opção -s de tr "aperta" caracteres de repetição. Conforme mostrado, o switch pode ser usado com um intervalo de caracteres: a to z .

    
por 26.02.2015 / 19:12
8

Em um sistema GNU, você precisará usar sed ou similar se sua localidade usar caracteres multibyte ( como o jimmij sugere ) porque o GNU tr pode referenciar apenas um caractere por byte. Em uma localidade ASCII, você pode remover todas as duplicatas com tr , como:

LC_ALL=C tr -s '
echo Thhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '
This is my name
-5'
-5' <input

Então ...

echo TThhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '1-2'

... imprime ...

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

Você também pode fazer isso seletivamente consultando seus alvos por intervalo:

Thhiisss iisss mmyyy nameeee

... ou ...

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

... que funcionam para ser a mesma coisa e que ambos imprimem:

TTTThis is my name

... ou use [:punct:] , [:digit:] , [:lower:] , [:alpha:] ou o que você quiser. Você também pode negar a seleção com -c , então ...

LC_ALL=C tr -s '
echo Thhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '
This is my name
-5'
-5' <input

... imprime ...

echo TThhiisss iisss mmyyy nameeee|
LC_ALL=C tr -s '1-2'
    
por 26.02.2015 / 19:41
6

Uma maneira com sed :

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

ou ainda mais simples:

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

(obrigado Costas e mikeserv por comentários).

    
por 26.02.2015 / 19:11
3

Experimente tr :

echo "Thhiisss iisss mmyyy nameeee" | tr -s 'hismye'
    
por 26.02.2015 / 19:12