參考資料:https://www.thegeekstuff.com/2012/12/linux-tr-command/
簡介
tr命令用於轉換、刪除或者去除重複字元。它從STDIN中讀取資料並且將其寫入SDTOUT。
因此它的用法是這樣的。從使用者鍵入的STDIN中讀取。
[root@C7 ~]# tr abc ABC
abcdefg
ABCdefg
aabbcc
AABBCC
def
def
或者這樣的。通過輸入重定向來讀取檔案的資料。
[root@C7 ~]# cat tr.txt
abcdefg
aabbcc
def
[root@C7 ~]# tr abc ABC < tr.txt
ABCdefg
AABBCC
def
因為是寫入到STDOUT,因此不會修改作為STDIN的檔案的內容。
它不支援直接將檔案作為命令的引數傳入。
[root@C7 ~]# tr abc ABC tr.txt
tr: extra operand ‘tr.txt’
Try `tr --help` for more information.
語法格式
tr [OPTION]... SET1 [SET2]
轉換
如果SET1和SET2都指定了並且沒有-d選項。那麼tr就會將SET1中的每個字元按照位置一一替換為SET2中對應的每個字元。
1. 大小寫轉換
[root@C7 ~]# tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
zhangwenlong
ZHANGWENLONG
[root@C7 ~]# tr [:lower:] [:upper:]
zhangwenlong
ZHANGWENLONG
[root@C7 ~]# tr a-z A-Z
zhangwenlong
ZHANGWENLONG
2. 括號轉換
括號這類符號也可以進行轉換,不過要注意的是需要使用引號包裹。
[root@C7 ~]# cat tr.txt
{zhang} {wen} {long}
[root@C7 ~]# tr {} () < tr.txt
-bash: syntax error near unexpected token `(`
[root@C7 ~]# tr `{}` `()` < tr.txt
(zhang) (wen) (long)
[root@C7 ~]# tr "{}" "()" < tr.txt
(zhang) (wen) (long)
預設情況下,是將轉換後的結果寫到STDOUT,可以通過輸出重定向至檔案。
注意:這不會改變原檔案。
[root@C7 ~]# cat tr.txt
{zhang} {wen} {long}
[root@C7 ~]# tr `{}` `()` < tr.txt > tr_new.txt
[root@C7 ~]# cat tr.txt
{zhang} {wen} {long}
[root@C7 ~]# cat tr_new.txt
(zhang) (wen) (long)
如果STDIN和STDOUT的檔案是同一個的話,也無法達到像我們預期的那樣修改檔案的效果。
反而會清空檔案!!!
[root@C7 ~]# cat tr.txt
{zhang} {wen} {long}
[root@C7 ~]# tr `{}` `()` < tr.txt > tr.txt
[root@C7 ~]# cat tr.txt
[root@C7 ~]# wc -l tr.txt
0 tr.txt
3. 空格轉換製表符
注意,不僅僅是空格被轉換,末尾的換行符也被轉換了。
[root@C7 ~]# echo "This is for testing" | tr [:space:] ` `
This is for testing [root@C7 ~]#
通過這個例子比較直觀可以顯示了。
[root@C7 ~]# echo "This is for testing" | tr [:space:] `L`
ThisLisLforLtestingL[root@C7 ~]#
4. 使用-s選項來壓縮重複的字元
案例3中,如果空格的數量大於一個,那麼我們在轉換的時候,就會針對每一個連續且重複的空格都進行轉換為製表符的操作,如下所示。
[root@C7 ~]# echo "This is for testing" | tr [:space:] ` `
This is for testing [root@C7 ~]#
[root@C7 ~]# echo "This is for testing" | tr [:space:] ` `
This is for testing [root@C7 ~]#
通過-s選項,就會將連續且重複的字元,僅識別為單個字元,然後進行轉換。
[root@C7 ~]# echo "This is for testing" | tr [:space:] ` `
This is for testing [root@C7 ~]#
[root@C7 ~]# echo "This is for testing" | tr -s [:space:] ` `
This is for testing [root@C7 ~]#
同樣的,可以將多個連續的空格轉換為單個空格字元。
[root@C7 ~]# echo "This is for testing" | tr -s [:space:] ` `
This is for testing
5. 使用-d選項刪除特定的字元
因為是刪除,所以在語法格式中,只需要SET1,不需要SET2。
[root@C7 ~]# echo "the geek stuff" | tr -d t
he geek suff
[root@C7 ~]# echo "my number is 89757" | tr -d [:digit:]
my number is
如果想要刪除檔案中符合條件的行的話,那麼需要使用sed命令。
6. 使用-c選項來獲取集合的補集
因為是數字的補集,所以末尾的換行符也被刪除了。
[root@C7 ~]# echo "my number is 89757" | tr -cd [:digit:]
89757[root@C7 ~]#
7. 刪除不可列印字元
第五行是三個空格,第六行是三個製表符。從結果來看,不可列印的字元應該是換行符和製表符。
[root@C7 ~]# cat tr.txt
zhangwenlong
ZHANGWENLONG
123456
!@#$%^
[root@C7 ~]# tr -dc [:print:] < tr.txt
zhangwenlongZHANGWENLONG123456!@#$%^ [root@C7 ~]#
8.將檔案中的所有行合併為一行
[root@C7 ~]# cat tr.txt
zhangwenlong
ZHANGWENLONG
123456
!@#$%^
[root@C7 ~]# tr -s `
` ` ` < tr.txt
zhangwenlong ZHANGWENLONG 123456 !@#$%^ [root@C7 ~]#