226 瀏覽數

Linux command – tr

tr – (translate or delete characters ) 這個指令可以用來做字元的取代或是刪除.tr 只能針對字元來處理,如果要對字串做處理的話,必須使用 sed 來處理, 請參考 http://benjr.tw/97129

tr [OPTION]... SET1 [SET2]

下面是他常用的參數.

-d, –delete

刪除 SET1 定義的字元.

root@ubuntu:~# ls -l
total 28
-rwxr-xr-x 1 root root   66 Jul  9 19:40 for.sh
-rwxr-xr-x 1 root root  330 Jul  9 19:43 ping.sh
-rw-r--r-- 1 root root  202 Jul 10 20:14 pw
drwxr-xr-x 2 root root 4096 Jul 11 03:07 sas3
-rw-r--r-- 1 root root    5 Jul 10 00:23 text1.txt
-rw-r--r-- 1 root root    5 Jul 10 00:26 text2.txt
-rwxr-xr-x 1 root root  106 Jul 10 01:20 while.sh

可以看到關於小寫英文 [a-z] 的字元都被刪除了.

ubuntu:~# ls -l | tr -d [a-z]
 28
--- 1     66 J  9 19:40 .
--- 1    330 J  9 19:43 .
------ 1    202 J 10 20:14 
-- 2   4096 J 11 03:07 3
------ 1      5 J 10 00:23 1.
------ 1      5 J 10 00:26 2.
--- 1    106 J 10 01:20 .

SETs 可以用下面的的特殊符號來表示:

  • \NNN ASCII表 的八進制代碼
  • \\ backslash (\ 反斜線)
  • \a audible BEL (鈴聲)
  • \b backspace (倒退鍵)
  • \f form feed
  • \n new line (換行)
  • \r return (return 鍵)
  • \t horizontal tab (tab 鍵)
  • \v vertical tab
  • CHAR1-CHAR2 從字元 1 到 字元2 按升序排列
  • [CHAR*] in SET2, copies of CHAR until length of SET1
  • [CHAR*REPEAT] REPEAT copies of CHAR, REPEAT octal if starting with 0
  • [:alnum:] 文字或是數位字元,表示為 [A-Z,a-z,0-9]
  • [:alpha:] 文字字元,表示為 [A-Z,a-z]
  • [:lower:] 小寫字元,表示為 [A-Z]
  • [:upper:] 大寫字元,表示為 [a-z]
  • [:digit:] 數位字元,表示為 [0-9]
  • [:xdigit:] 十六進位數字 0-9,A(10),B(11),C(12),D(13),E(14),F(15),表示為 [0-9,a-f,A-F]
  • [:space:] 所有空白字元 ,含 空白鍵, Tab, CR (新行)
  • [:graph:] 除了空字元 (空白鍵與 Tab 按鍵) 外的其他鍵.
  • [:print:] 非空字元 ,包括空格.
  • [:cntrl:] 控制字元.
  • [:punct:] 標點符號.

-s, –squeeze-repeats

如果有連續重覆的字元出現,就刪除只保留一個.
下面範例會刪除小寫英文 [a-z] 中連續重覆出現的字元,root 變成 rot 了.

root@ubuntu:~# ls -l | tr -s [a-z]
total 28
-rwxr-xr-x 1 rot rot   66 Jul  9 19:40 for.sh
-rwxr-xr-x 1 rot rot  330 Jul  9 19:43 ping.sh
-rw-r--r-- 1 rot rot  202 Jul 10 20:14 pw
drwxr-xr-x 2 rot rot 4096 Jul 11 03:07 sas3
-rw-r--r-- 1 rot rot    5 Jul 10 00:23 text1.txt
-rw-r--r-- 1 rot rot    5 Jul 10 00:26 text2.txt
-rwxr-xr-x 1 rot rot  106 Jul 10 01:20 while.sh

前面的例子可以改成為

root@ubuntu:~# ls -l | tr -s [:lower:]
total 28
-rwxr-xr-x 1 rot rot   66 Jul  9 19:40 for.sh
-rwxr-xr-x 1 rot rot  330 Jul  9 19:43 ping.sh
-rw-r--r-- 1 rot rot  202 Jul 10 20:14 pw
drwxr-xr-x 2 rot rot 4096 Jul 11 03:07 sas3
-rw-r--r-- 1 rot rot    5 Jul 10 00:23 text1.txt
-rw-r--r-- 1 rot rot    5 Jul 10 00:26 text2.txt
-rwxr-xr-x 1 rot rot  106 Jul 10 01:20 while.sh

-t, –truncate-set1

把 SET1 字元內容改成為 SET2 的.
下面的兩個例子都是把 小寫字元改成為 大寫字元.

root@ubuntu:~# ls -l | tr -t '[a-z]' '[A-Z]'
TOTAL 28
-RWXR-XR-X 1 ROOT ROOT   66 JUL  9 19:40 FOR.SH
-RWXR-XR-X 1 ROOT ROOT  330 JUL  9 19:43 PING.SH
-RW-R--R-- 1 ROOT ROOT  202 JUL 10 20:14 PW
DRWXR-XR-X 2 ROOT ROOT 4096 JUL 11 03:07 SAS3
-RW-R--R-- 1 ROOT ROOT    5 JUL 10 00:23 TEXT1.TXT
-RW-R--R-- 1 ROOT ROOT    5 JUL 10 00:26 TEXT2.TXT
-RWXR-XR-X 1 ROOT ROOT  106 JUL 10 01:20 WHILE.SH
root@ubuntu:~# ls -l | tr -t '[[:lower:]]' '[[:upper:]]'
TOTAL 28
-RWXR-XR-X 1 ROOT ROOT   66 JUL  9 19:40 FOR.SH
-RWXR-XR-X 1 ROOT ROOT  330 JUL  9 19:43 PING.SH
-RW-R--R-- 1 ROOT ROOT  202 JUL 10 20:14 PW
DRWXR-XR-X 2 ROOT ROOT 4096 JUL 11 03:07 SAS3
-RW-R--R-- 1 ROOT ROOT    5 JUL 10 00:23 TEXT1.TXT
-RW-R--R-- 1 ROOT ROOT    5 JUL 10 00:26 TEXT2.TXT
-RWXR-XR-X 1 ROOT ROOT  106 JUL 10 01:20 WHILE.SH

發表迴響