命令:tr

阿龍弟弟發表於2018-12-04

參考資料: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 ~]#

相關文章