
При использовании tr -t
команды ее string1
следует обрезать до длины string2
, верно?
tr -t abcdefghijklmn 123 # abc... = string1, 123 = string2
the cellar is the safest place # actual input
the 3ell1r is the s1fest pl13e # actual output
'truncate' — это другое слово для 'to shorten', верно? tr
переводится, согласно шаблону, как полное игнорирование -t
опции. Если я автоматически дополню --truncate-set1
[to sure that I use the right option], выводится тот же результат.
Вопрос: что я делаю не так?
Я работаю в BASH, на дистрибутиве на базе Debian.
ОБНОВЛЯТЬ
Обратите внимание, что это копия комментария, который я оставил ниже.
Я думал, tr -t
что это означает:укоротить строку1 до длины строки2. Я вижу, что a
это переводится как 1
, это b
будет переведено как 2
и это c
переводится как 3
. Это не имеет ничего общего с сокращением. «Усечение», похоже, означает что-то другое, чем я думал. [Я не носитель языка]
решение1
При использовании команды tr -t строка1 должна быть обрезана до длины строки2, верно?
Разве это не то, что произошло?
abcdefghijklmn
123
Обратите внимание, какие буквы поменяны местами, а какие нет:
the 3ell1r is the s1fest pl13e
«a» и «c», но не e, f, i или l, которые были в исходном (не усеченном) наборе 1.
Без -t
, вы получаете:
t33 33331r 3s t33 s133st p3133
Это потому что (из man tr
),«SET2 расширен до длины SET1повторив его последний символкак надо." Таким образом, без -t
усечения набора 1, то, что у вас есть, то же самое, что и
tr abcdefhijklmn 1233333333333
Давайте рассмотрим другой пример, но используя в качестве входных данных то же самое «подвал — самое безопасное место».
> input="the cellar is the safest place"
> echo $input | tr is X
the cellar XX the XafeXt place
-t
Это происходит потому, что второй набор автоматически расширяется, чтобы охватить весь первый набор. делает противоположное этому; он усекает первый набор, а не расширяет второй:
> echo $input | tr -t is X
the cellar Xs the safest place
Что то же самое, что:
> echo $input | tr i X
the cellar Xs the safest place
Так как 's' было усечено из первого набора. Если бы два набора были одинаковой длины, то использование -t
не имело бы никакого значения:
> echo $input | tr is XY
the cellar XY the YafeYt place
> echo $input | tr -t is XY
the cellar XY the YafeYt place