一、tr命令介紹
tr命令主要用來從標準輸入中通過替換或刪除操作進行字符轉換,然後打印輸出到標準輸出。可以通過管道或重定向標準輸入來獲得 tr 的輸入數據。tr 對輸入數據可以進行三種操作: 字符替換、壓縮重複字符和刪除字符。
tr命令格式:tr [OPTION] String1 [String2]
二、命令詳細說明
1. 在tr中string1和string2用來指示一個字符集合範圍。可以是下面的一些形式(一般要加雙引號):
1) [a-d] : [a-d]表示abcd,常用的有[a-z]、[A-Z]、[0-9]等,[bfgh]表示 bfgh。可以加上單或雙引號
2) [C*n] : 表示字符 C 重複出現指定次數n。因此,[F*3]表示FFF。一般只能出現在 string2中。
3) \nnn : 三位八進制數,對應有效的 ASCII 字符。一般用於表示特定的控制字符。
速記符 含義 八進制方式
\a Ctrl-G 鈴聲 \007
\b Ctrl-H 退格符 \010
\f Ctrl-L 走行換頁 \014
\n Ctrl-J 新行 \012
\r Ctrl-M 回車 \015
\t Ctrl-I tab 鍵 \011
\v Ctrl-X \030
4) [:class_name:] : tr 支持使用內建的字符類別。常見的字符類別有:
[:alnum:] 字母、數字(0-9,a-z,A-Z)
[:alpha:] 字母(a-z,A-Z)
[:cntrl:] 控制字符
[:digital:] 數字(0-9)
[:graph:] 可打印的字符,不包含空格
[:lower:] 小寫字母(a-z)
[:print:] 可打印的字符,包含空格
[:punct:] 標點符號
[:space:] 空格
[:upper:] 大寫字母(A-Z)
[:xdigital:] 16 進制數字(0-9,a-f,A-F)
5) 普通字符串形式: 比如 aeiou、bdfgh 等。
2.選項"-c": 表示用在輸入數據中出現,但是不包含在 string1 字符範圍內的字符組成的集合,代替原來的 string1。在 tr 的三類操作中都可以使用選項"-c"。
eg: echo "adcfghg" | tr -cd fgca // 將顯示 acfgg 輸入數據中不包含在 string1 中的字符範圍 是"dh" ,所以,實際上只是刪除了字符"dh"
3.tr 用於字符替換: 只需要同時給出 string1 和 string2,可以需要不指定特別的選項。
1) Usage: tr string1 string2
輸入數據中屬於 string1 字符範圍內的字符都將被替換,string1 中的第 n 個字符被替換爲 string2 中的第 n個字符。
eg: echo "adcfgh" | tr adcgw vbnle // 將顯示 vbnflh (v 替換 a,b 退回 d ,n 替換 c,l 替換 g...)
2) 一般 string1 和 string2 的字符個數應該相同。如果字符個數不同,分爲兩種情況:
① string1 的字符個數少於 string2 的字符個數: string2 種額外的字符將被忽略。
② string1 的字符個數多於 string2 的字符個數,又可分爲兩種情況:
·對於 BSD 系列的系統: tr 會重複 string2 中的最後一個字符,直到補齊到 string1 一樣的長度。
·對於 System V 的系統 : tr 將截去 string1 中超長的部分。
GUN tr 使用 BSD 方式,如果想使用 System V 方式,需要指定選項"-t"。
eg: echo "addcfghg" | tr adcgw vbn // 將打印 vbbnfnhn
echo "addcfghg" | tr -t adcgw vbn // 將打印 vbbnfghg
3) tr 的字符替換操作主要用途有 大小寫轉換等。
eg: tr [a-z] [A-Z] < video.txt // 將文件 video.txt 中的所有小寫字母轉換成大寫字母
tr ":" "\011" < /etc/passwd // 將 passwd 文件的域分隔符改爲"\011"即"TAB"
4.tr 用於刪除字符: 使用選項"-d"。
1) Usage: tr -d string1
輸入數據中所有在 string1 中出現過的字符都將被刪除。
2) echo "This is a note !"| tr -d [:space:] // 將打印 Thisisanote 即刪除所有空格
tr -cd "[a-z][A-Z][\n]" <diary.txt // 文件 diary.txt 中非字母或回車的字符都將被刪除
5.tr 用於壓縮重複字符: 使用選項"-s"。壓縮操作可以單獨進行,也可以在替換操作或刪除操作之後進行,因而分成 3 種情況:
1) Usage: tr -s string1
輸入數據中連續出現的字符,只有還在 string1 中出現過的,纔會將被壓縮成一個字符。
eg: echo "aaaccdefffgghhh"| tr -s adeg // 將打印 accdefffghhh (string1 中無字符"cfh")
tr -s "\n" < plane.txt // 刪除文件 plane.txt 中的空行 (即壓縮回車符)
2) Usage: tr -s string1 string2
string1 和 string2 用於替換操作,string2 還用於壓縮操作。
eg: tr -s "[\015\032]" "[\012*]" <input_file // 將文件 iput_file 從 dos 格式轉換到 unix 格式
3) Usage: tr -ds string1 string2
string1 用於刪除操作,string2 用於壓縮操作。
eg: echo "aaaccdefffgghhh"| tr -ds adeg fh // 將打印 ccfh
echo "aaaccdefffgghhh"| tr -d adeg // 將打印 ccfffhhh
6.在 tr 的替換操作中,如果 string1 使用了中括號"[ ]",那麼 string2 也應該使用"[ ]"。
7.tr 主要用於字符轉換或者抽取控制字符。tr 的大多數功能都可以用 sed 來完成,但有些人寧願使用 tr,因爲tr 更加快捷、容易。