[英]Transliteration behavior (tr program in shell)
我了解 tr 的基本行為,但在涉及集合和序列時感到困惑。 一些例子:
$ tr 'a' '[0]'
aaaaaa
[[[[[[
$ tr 'a-z' '[0-9]'
abcdef
[01234
$ tr 'a-z' '[*]'
abcde
[*]]]
$ tr 'a-z' '[\n]'
abcdef
[
]]]]
$ tr 'a-z' '[\n*]'
abcdef
$ tr 'a-z' '\n'
abcdef
在我看來,在某些情況下(比如[\n*]
)它正確地解釋了集合,但在其他情況下,它似乎停在右括號處並連續 output 那個。 我原以為集合[]
的意思是“任何一個包含的字符”,並且*
不會被視為集合中的特殊字符。 這似乎在某些情況下適用,但在其他情況下則不然。 這里發生了什么?
此外,在我看來tr 'az' '\n'
執行與tr 'az' '[\n*]
相同的操作。 我缺少一些細微差別嗎?
[
只有在以[CHAR*]
、 [CHAR*REPEAT]
、 [:POSIXCLASS:]
或[=CHAR=]
形式提供集合時才具有特殊含義。
從您的示例中,只有tr 'az' '[\n*]'
被解釋為集合(“在 SET2 中,復制 CHAR 直到 SET1 的長度”); 所有其他示例均按字面解釋。
所以tr 'af' '[*]'
等同於寫tr 'abcdef' '[*]'
並且會翻譯 a→[, b→*, c→], d→], e→], f→]。
tr 'af' '[\n*]'
然而與編寫tr 'abcdef' '\n\n\n\n\n\n'
相同的,並且將用換行符替換每個字符。 對於單個字符,這已經是tr
的默認值,因此您可以簡單地編寫tr 'af' '\n'
就像您在上一個示例中發現的那樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.