Ao usar tr -t
o comando, string1
deve ser truncado para o comprimento de string2
, certo?
tr -t abcdefghijklmn 123 # abc... = string1, 123 = string2
the cellar is the safest place # actual input
the 3ell1r is the s1fest pl13e # actual output
'truncar' é outra palavra para 'encurtar', certo? tr
traduz, de acordo com o padrão, ignorando completamente a -t
opção. Se eu preencher automaticamente para --truncate-set1
[para garantir que uso a opção correta] produzirá a mesma saída.
Pergunta: O que estou fazendo de errado aqui?
Eu trabalho no BASH, em uma distribuição baseada em Debian.
ATUALIZAR
Observe que esta é uma cópia de um comentário que fiz abaixo
Eu pensei tr -t
que significa:encurte string1 para o comprimento de string2. Vejo que a
está traduzido para 1
, que b
seria traduzido para 2
e que c
está traduzido para 3
. Isso não tem nada a ver com encurtamento. 'Truncar' parece significar algo diferente do que eu pensava. [Não sou falante nativo]
Responder1
Ao usar o comando tr -t, string1 deve ser truncado para o comprimento de string2, certo?
Não foi isso que aconteceu?
abcdefghijklmn
123
Observe quais letras são ou não trocadas:
the 3ell1r is the s1fest pl13e
'a' e 'c', mas não e, f, i ou l, que estavam no conjunto original (não truncado) 1.
Sem o -t
, você obtém:
t33 33331r 3s t33 s133st p3133
Isso ocorre porque (de man tr
),"SET2 é estendido até o comprimento de SET1repetindo seu último caracterecomo necessário." Então, sem -t
truncar o conjunto 1, o que você tem é o mesmo que
tr abcdefhijklmn 1233333333333
Vamos considerar outro exemplo, mas usando o mesmo “o porão é o lugar mais seguro” como entrada.
> input="the cellar is the safest place"
> echo $input | tr is X
the cellar XX the XafeXt place
Isso ocorre porque o segundo conjunto é automaticamente estendido para cobrir todo o primeiro conjunto. -t
essencialmentefaz o oposto disso; trunca o primeiro conjunto em vez de estender o segundo:
> echo $input | tr -t is X
the cellar Xs the safest place
Que é o mesmo que:
> echo $input | tr i X
the cellar Xs the safest place
Já que o 's' foi truncado do primeiro conjunto. Se os dois conjuntos tivessem o mesmo comprimento, usar -t
não faria diferença:
> echo $input | tr is XY
the cellar XY the YafeYt place
> echo $input | tr -t is XY
the cellar XY the YafeYt place