# tr命令如何使用
## 1. 概述
`tr`(translate)是Unix/Linux系統中一個強大的字符轉換和刪除工具。它主要用于從標準輸入讀取數據,經過字符替換、壓縮或刪除后輸出到標準輸出。作為文本處理的基礎工具之一,`tr`以其簡潔高效的特性被廣泛應用于shell腳本和日常命令行操作中。
### 1.1 tr命令的特點
- **單行處理**:逐字符處理輸入流
- **輕量高效**:不直接修改源文件
- **功能專注**:專注于字符級轉換
- **正則支持**:支持簡單的字符類表達式
### 1.2 典型應用場景
- 大小寫轉換
- 字符集替換
- 刪除特定字符
- 壓縮重復字符
- 簡單的加密/解密
## 2. 基本語法
```bash
tr [選項]... SET1 [SET2]
| 參數 | 說明 |
|---|---|
| SET1 | 指定要轉換或刪除的字符集合 |
| SET2 | 指定轉換目標字符集合(當進行刪除操作時可省略) |
| 選項 | 全稱 | 作用 |
|---|---|---|
| -d | –delete | 刪除SET1中的字符 |
| -s | –squeeze-repeats | 壓縮SET1中連續重復的字符 |
| -c | –complement | 對SET1取補集 |
| -t | –truncate-set1 | 將SET1截斷為與SET2等長 |
# 將小寫字母轉換為大寫
echo "hello world" | tr 'a-z' 'A-Z'
# 輸出: HELLO WORLD
# 字符一對一映射
echo "abcde" | tr 'abc' '123'
# 輸出: 123de
注意:當SET1比SET2長時,SET2最后一個字符會被重復使用
# 刪除所有數字
echo "My phone is 123-4567" | tr -d '0-9'
# 輸出: My phone is -
# 刪除所有標點
echo "Hello, World!" | tr -d '[:punct:]'
# 輸出: Hello World
# 壓縮連續空格
echo "Too many spaces" | tr -s ' '
# 輸出: Too many spaces
# 壓縮連續換行符
tr -s '\n' < multiline.txt
tr支持預定義的字符類:
| 字符類 | 等價表示 | 說明 |
|---|---|---|
| [:alnum:] | - | 字母和數字 |
| [:alpha:] | - | 字母 |
| [:digit:] | 0-9 | 數字 |
| [:lower:] | a-z | 小寫字母 |
| [:upper:] | A-Z | 大寫字母 |
| [:space:] | - | 空白字符 |
| [:punct:] | - | 標點符號 |
示例:
# 將所有標點替換為空格
echo "Hello, World!" | tr '[:punct:]' ' '
tr支持的特殊轉義序列:
| 轉義符 | 含義 |
|---|---|
| \n | 換行 |
| \t | 制表符 |
| \ | 反斜杠 |
| \ooo | 八進制值字符 |
示例:
# 將制表符轉換為空格
tr '\t' ' ' < tabbed_file.txt
# 刪除所有非數字字符
echo "Phone: 123-4567" | tr -cd '[:digit:]'
# 輸出: 1234567
# 旋轉字母13個位置(ROT13加密)
echo "secret" | tr 'A-Za-z' 'N-ZA-Mn-za-m'
# 輸出: frperg
# 十六進制字符處理
echo "ABCD" | tr 'A-F' '0-5'
# 輸出: 0123
# 將DOS格式換行(CRLF)轉換為Unix格式(LF)
tr -d '\r' < dos_file.txt > unix_file.txt
# 將文件中的多個空行壓縮為單個空行
tr -s '\n' < input.txt > output.txt
# 清理日志文件中的非ASCII字符
tr -cd '\11\12\15\40-\176' < dirty.log > clean.log
# 提取CSV文件中的特定列
cut -d',' -f1 data.csv | tr -d '"'
# 生成8位隨機密碼
cat /dev/urandom | tr -dc 'A-Za-z0-9' | head -c 8
# 比較兩個文件(忽略大小寫和空格差異)
tr 'A-Z' 'a-z' < file1 | tr -s ' ' > normalized1
tr 'A-Z' 'a-z' < file2 | tr -s ' ' > normalized2
diff normalized1 normalized2
tr通常比sed或awk更快字符順序問題:
# 錯誤示例:會先轉換A為B,然后轉換B為A
echo "ABC" | tr 'AB' 'BA'
# 輸出: BAC
多字節字符:tr不直接支持UTF-8多字節字符處理
集合長度不匹配:
# SET2會被填充最后一個字符
echo "abcdef" | tr 'abcd' '12'
# 輸出: 1222ef
當需要更復雜的功能時,可考慮:
- sed:支持正則表達式和更復雜的替換
- awk:適合字段處理和條件轉換
- iconv:專業的字符編碼轉換工具
# 統計文本中不同單詞的出現頻率(忽略大小寫)
cat text.txt | tr 'A-Z' 'a-z' | tr -s ' ' '\n' | sort | uniq -c | sort -nr
# 查找并刪除所有臨時文件
find . -name "*.tmp" | tr '\n' '\0' | xargs -0 rm
# 提取文本中所有唯一單詞
tr -cs '[:alpha:]' '\n' < document.txt | sort | uniq
GNU版本的tr提供了一些擴展功能:
- 支持\b(退格)、\f(換頁)等更多轉義字符
- 更嚴格的錯誤檢查
BSD實現(包括macOS): - 對字符類的實現略有不同 - 部分轉義序列行為不一致
減少管道使用:合并多個tr操
“`bash
cat file | tr ‘A-Z’ ‘a-z’ | tr -d ‘\n’
# 推薦 tr ‘A-Z’ ‘a-z’ < file | tr -d ‘\n’
2. **使用字符類代替顯式枚舉**
```bash
# 較差
tr '0123456789' 'xxxxxxxxxx'
# 較好
tr '0-9' 'x'
避免不必要的字符處理
# 處理前先過濾
grep 'pattern' file | tr 'a-z' 'A-Z'
tr命令作為Unix文本處理工具鏈中的重要一環,雖然功能相對簡單,但在字符級轉換和刪除操作上具有無可比擬的效率優勢。掌握tr命令可以:
記住tr的核心特點:
- 專精于字符集轉換
- 不直接修改源文件
- 通常作為管道的一部分使用
通過本文介紹的基礎和高級用法,讀者應能夠將tr命令靈活應用于各種文本處理場景中。
| 功能 | 命令示例 |
|---|---|
| 大小寫轉換 | tr 'a-z' 'A-Z' |
| 刪除數字 | tr -d '0-9' |
| 壓縮空格 | tr -s ' ' |
| 加密(ROT13) | tr 'A-Za-z' 'N-ZA-Mn-za-m' |
| 刪除非打印字符 | tr -cd '\11\12\15\40-\176' |
| DOS轉Unix換行 | tr -d '\r' |
| 制表符轉空格 | tr '\t' ' ' |
| 生成隨機字符串 | tr -dc 'A-Za-z0-9' < /dev/urandom \| head -c 16 |
”`
這篇文章總計約2850字,全面介紹了tr命令的用法,包含基礎語法、常用選項、實用案例、注意事項等內容,采用Markdown格式編寫,結構清晰,便于閱讀和參考。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。