使用 tr -t 指令【理解題】

使用 tr -t 指令【理解題】

使用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

相關內容