使用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
「截斷」是「縮短」的另一個詞,對嗎?tr
根據模式進行翻譯,完全忽略該-t
選項。如果我自動完成--truncate-set1
[以確保我使用正確的選項]會產生相同的輸出。
問題: 我在這裡做錯了什麼?
我在 BASH 工作,在基於 Debian 的發行版上工作。
更新
請注意,這是我在下面發表的評論的副本
我以為的tr -t
意思是:將 string1 縮短為 string2 的長度。我看到那個a
被翻譯成1
,那個b
將被翻譯成2
,那個c
被翻譯成3
。這與縮短無關。 「截斷」的意思似乎與我想像的不同。 [我不是母語]
答案1
當使用tr -t指令時,string1應該被截斷為string2的長度,對吧?
這不是發生了什麼事嗎?
abcdefghijklmn
123
注意哪些字母被交換,哪些字母沒有被交換:
the 3ell1r is the s1fest pl13e
'a' 和 'c',但不包括原始(未截斷)集合 1 中的 e、f、i 或 l。
如果沒有-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