text / tr === ###### tags: `OS / Ubuntu / cmd / text` ###### tags: `OS`, `Ubuntu`, `linux`, `command`, `text`, `tr`, `translate`, `delete`, `squeeze`, `transformation` <br> [TOC] <br> :::info ### 🧵 text / tr - tr 是屬於 **文字轉換工具(text transformation tool)** - 用途為:**逐字元轉換(translate)、刪除(delete)、壓縮(squeeze)** - 適合處理:**簡單、線性的字元級處理**,如大小寫轉換、刪除空白、字元替換等 ::: <br> ## tr > **man**: translate or delete characters <br> ## 範例 ### 字元轉換(小寫轉換為大寫) - 將輸入中的所有小寫字母轉換為大寫字母: ``` echo "hello world" | tr 'a-z' 'A-Z' ``` - 輸出: ``` HELLO WORLD ``` <br> ### 字元轉換(大寫轉換為小寫) - 將輸入中的所有大寫字母轉換為小寫字母: ``` echo "HELLO WORLD" | tr 'A-Z' 'a-z' ``` - 輸出: ``` hello world ``` <br> ### 刪除指定字元 - 刪除輸入中的所有數字: ``` echo "a1b2c3d4" | tr -d '0-9' ``` - 輸出: ``` abcd ``` <br> ### 壓縮重複字元 - 將重複的空格壓縮為單一空格: ``` echo "This is a test" | tr -s ' ' ``` - 輸出: ``` This is a test ``` <br> ### 字元替換 - 將輸入中的冒號(:)替換為空格: ``` echo "one:two:three" | tr ':' ' ' ``` - 輸出: ``` one two three ``` <br> ### 字元類 - 將輸入中的所有數字替換為#號碼: ``` echo "My phone number is 123-456-7890" | tr '0-9' '#' ``` - 輸出: ``` My phone number is ###-###-#### ``` <br> --- <br> ## 討論 ### `tr '[:upper:]' '[:lower:]'` 這指令用法如何拆解? - ### gpt-4o (2025/05/12) 這個指令是 `tr`(translate)指令的用法,它將文字中的 **大寫字母轉為小寫字母**。以下是詳細拆解: --- ### 📌 完整指令 ``` tr '[:upper:]' '[:lower:]' ``` --- ### ✅ `tr` 指令簡介 `tr` 是 Linux 中用來**字元替換、壓縮、刪除**的工具,全名是 **translate**。 語法: ``` tr [OPTION] SET1 [SET2] ``` --- ### ✅ `[:upper:]` 是什麼? 這是 POSIX 定義的「字元類別(character class)」,代表: - `[:upper:]`:**所有大寫英文字母 A-Z** - `[:lower:]`:**所有小寫英文字母 a-z** --- ### ✅ 套用結果是什麼? 把輸入的每一個字元,**如果是大寫字母,就轉成對應的小寫字母**。 🔹範例: ``` echo "Hello GPU A40" | tr '[:upper:]' '[:lower:]' ``` 🔸輸出: ``` hello gpu a40 ``` --- ### 🧠 額外補充:為何不用 `'A-Z' 'a-z'`? 你也可以寫成: ``` tr 'A-Z' 'a-z' ``` 但這在某些非英文語系環境(如 UTF-8 / 多語系 LC_ALL)下可能會失效或產生預期外結果。而使用 `[:upper:]` / `[:lower:]` 屬於更安全、具跨平台兼容性的寫法。 <br> ### tr 指令常見用法對照表 - ### gpt-4o (2025/05/12) ### tr 指令常見用法對照表 | 用法 | 說明 | 範例輸入 | 指令 | 輸出結果 | |------|------|---------|------|----------| | `A-Z` → `a-z` | 大寫轉小寫 | `HELLO GPU` | `tr 'A-Z' 'a-z'` | `hello gpu` | | `[:upper:]` → `[:lower:]` | 大寫轉小寫(更通用) | `HELLO GPU` | `tr '[:upper:]' '[:lower:]'` | `hello gpu` | | `a-z` → `A-Z` | 小寫轉大寫 | `hello gpu` | `tr 'a-z' 'A-Z'` | `HELLO GPU` | | `[:lower:]` → `[:upper:]` | 小寫轉大寫(更通用) | `hello gpu` | `tr '[:lower:]' '[:upper:]'` | `HELLO GPU` | | 刪除字元 | 用 `-d` 刪除指定字元 | `a b c d` | `tr -d ' '` | `abcd` | | 壓縮重複字元 | 用 `-s` 壓縮重複出現的字元 | `aaabbbbcc` | `tr -s 'a-z'` | `abc` | | 將空白轉為破折號 | 所有空格轉成 `-` | `a b c` | `tr ' ' '-'` | `a-b-c` | | 移除非字母數字 | 清除特殊符號 | `a#B@1$C` | `tr -cd '[:alnum:]'` | `aB1C` | | 清除換行變成單行 | 將多行變成一行 | 多行文字 | `tr -d '\n'` | 單行文字 | --- ### 補充:常見的 POSIX 字元類別 | 類別 | 說明 | 範圍 | |-------------|-----------|------------| | `[:upper:]` | 大寫字母 | `A-Z` | | `[:lower:]` | 小寫字母 | `a-z` | | `[:digit:]` | 數字 | `0-9` | | `[:alpha:]` | 英文字母 | `a-zA-Z` | | `[:alnum:]` | 字母與數字 | `a-zA-Z0-9` | | `[:space:]` | 空白符號 | 空格、tab、換行 | | `[:punct:]` | 標點符號 | `. , ! ? ; : …` 等 | --- ### 範例:合法 Kubernetes label 值格式轉換 ```bash echo "NVIDIA GeForce GTX 1080 Ti" \ | tr '[:upper:]' '[:lower:]' \ | sed -E 's/[^a-z0-9]+/-/g' \ | sed -E 's/^-+|-+$//g' ``` 輸出結果: ``` nvidia-geforce-gtx-1080-ti ``` <br> {%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}