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
.
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?
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
.
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'
Uma maneira com sed
:
sed ':X;s/\(.\)//g;tX'
ou ainda mais simples:
sed 's/\(.\)*//g'
(obrigado Costas e mikeserv por comentários).
Experimente tr
:
echo "Thhiisss iisss mmyyy nameeee" | tr -s 'hismye'