-s
Switch: Squeeze (remova caracteres repetidos)
echo i am a good boy | tr -s good bad
output:
i am a bd bdy
Há duas coisas acontecendo nos bastidores que fazem isso acontecer. Em primeiro lugar, se o segundo argumento para tr
for menor que o primeiro, então o último caractere no segundo argumento será repetido para torná-lo o mesmo comprimento que o primeiro. Então o comando equivalente é:
echo i am a good boy | tr -s good badd
A outra coisa que está acontecendo é quando os caracteres do primeiro argumento são repetidos sobrescrevem qualquer ocorrência anterior (estou me referindo aos dois oo
s em good
). Isso faz com que o comando agora seja equivalente a:
echo i am a good boy | tr -s god bdd
(a segunda substituição o
to d
substitui a substituição o
a a
anterior, tornando-a redundante)
Sem a opção -s
, a saída seria
i am a bddd bdy
Com o -s
switch tr
'aperta' qualquer caractere repetido listado no primeiro argumento, deixando a saída final:
i am a bd bdy
-c
Switch: complemento
A opção -c
é usada para corresponder ao complemento do primeiro argumento (ou seja, todos os caracteres não listados em arg 1). Como resultado, arg 1 conterá muitas letras (256-3). Agora, a mesma coisa acontece com arg 2 como no caso anterior: o caractere final de Arg 2 é repetido para corresponder ao tamanho ou Arg 1. Portanto, a declaração original:
echo i am a good boy | tr -c good bad
é equivalente a:
echo i am a good boy | tr abcefhijklmnp... baddddddddddd...
(observe os g
, o
e d
ausentes no primeiro conjunto, observe também que d
substituirá todos os outros caracteres no segundo conjunto - incluindo o caractere de espaço)
É por isso que i am a good boy
se transforma em dddddddgoodddodd
Mais informações aqui: link