# 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。