SHELL指令碼--tr命令用法和特性全解,shell指令碼--tr用法

來源:互聯網
上載者:User

SHELL指令碼--tr命令用法和特性全解,shell指令碼--tr用法

本文目錄:
1.1 簡介
1.2 tr映射
1.3 完全對應的替換
1.4 壓縮符號
1.5 刪除符號和補集

1.1 簡介

tr主要用於將從標準輸入讀取的資料進行結果集映射、字元壓縮和字元刪除。它首先會將讀取的標準輸入進行排序然後按照某種方式換行,然後再根據給出的命令列參數做相關處理。

tr [options] [SET1] [SET2]

-c:使用SET1的補集
-d:刪除字元
-s:壓縮字元
-t:截斷SET1,使得SET1的長度和SET2的長度相同

1.2 tr映射

如果同時指定了SET1和SET2,則是將SET1的符號按位置一一對應映射為SET2中的符號。換句話說,就是對應替換。

tr接收到stdin後首先會把將結果按照某種標記符號進行換行。例如:

[root@xuexi tmp]# ls              # 其中"one space.log"是帶有空格的檔案名稱a  b  c  d  logdir  one  one space.log  shdir  sh.txt  space.log  test  vmware-root

將空格定位點化。因為tr一接收到資料就進行了排序換行,所以結果僅只替換了"one space.log"中的空格。

[root@xuexi tmp]# ls | tr " " "\t"     # 結果是排序後換行的abcdlogdironeone    space.logshdirsh.txtspace.logtestvmware-root

之所以說tr是映射而不是替換,是因為兩個結果集替換的時候符號位置是一一對應的。如果SET1比SET2短,則SET2多餘的部分會被忽略,如果SET1比SET2長,POSIX認為這是不合理的,但也能執行,只不過結果有些意料之外,見下文。例如下面的例子,因為SET1中只有一個符號"\n",於是替換時SET2中的Y被忽略。

[root@xuexi tmp]# ls | tr "\n" "XY" aXbXcXdXlogdirXoneXone space.logXshdirXsh.txtXspace.logXtestXvmware-rootX

這樣就可以實現簡單的加密和解密。

[root@xuexi tmp]# echo "12345" | tr "0-9" "9876543210"     # 加密87654[root@xuexi tmp]# echo "87654" | tr "0-9" "9876543210"     # 解密12345

上面的過程是將管道左邊的12345對應到0-9的展開式0123456789,並將對應位映射到SET2的數字上。解密也是同理。

有一種ROT13密碼編譯演算法,它的加密和解密使用一套字元。它的SET1的字母位和SET2的字母位完全反向成對。例如SET1指定符號是"axy",如果SET2想將其對應為"opq",則須將SET1擴充為"axyopq",SET2擴充為"opqaxy",最終是(a,x,y,o,p,q)和(o,p,q,a,x,y),這樣(a,o)和(o,a)就能成功配對。再將其擴充為A-Z和a-z,就是所謂的ROT13加密,甚至還可以將0-9也加上去和9-0對應。下面是SET1和SET2的對應式。

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm

現在加密“I love you”

[root@xuexi tmp]# echo "I love you" | tr "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm" V ybir lbh

將“V ybir lbh”解密。

[root@xuexi tmp]# echo "V ybir lbh" | tr "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"I love you

1.3 完全對應的替換

預設情況下,當指定的SET1比SET2字元長時,從最後一個對應的位置開始,SET1的剩餘字元都和SET2的最後一個字元對應。假如SET1=[1234],SET2=[abc],則3對應c,4也對應c,此時如果tr的操作對象中出現3或者4都會被替換為c。

使用-t可以先截斷SET1比SET2中長的字元,例如上面截斷多餘的4,SET1=[123]和SET2=[abc]就實現了完全對應。

[root@xuexi tmp]# cat x.txtNO Name SubjectID Mark 備忘1  longshuai 001  56 不及格2  gaoxiaofang  001 60 及格3  zhangsan 001 50 不及格4  lisi    001   80 及格5  wangwu   001   90 及格[root@xuexi tmp]# cat x.txt | tr  "fang" "jin"   # 結果中n和g都被替換為了nNO Nime SubjectID Mirk 備忘1  lonnshuii 001  56 不及格2  nioxiiojinn  001 60 及格3  zhinnsin 001 50 不及格4  lisi    001   80 及格5  winnwu   001   90 及格[root@xuexi tmp]# cat x.txt | tr -t "fang" "jin"  # g被截斷,只對應替換fan為jinNO Nime SubjectID Mirk 備忘1  longshuii 001  56 不及格2  gioxiiojing  001 60 及格3  zhingsin 001 50 不及格4  lisi    001   80 及格5  wingwu   001   90 及格

1.4 壓縮符號

這功能太爽了。

tr -s [SET1] [SET2]

如果不指定SET2,則僅只壓縮,不做替換。SET1可以指定多個字元,這樣會對每個字元都進行壓縮,例如tr -s "0a",即會壓縮連續的0,也會壓縮連續的a。如果指定了SET2,則壓縮後還一一對應地進行替換。

假如x.txt檔案中的內容如下,空格有的地方多,有的地方少,也就是說這是一個沒有格式的檔案。

[root@xuexi tmp]# cat x.txtNO Name SubjectID Mark 備忘1  longshuai 001  56 不及格2  gaoxiaofang  001 60 及格3  zhangsan 001 50 不及格4  lisi    001   80 及格5  wangwu   001   90 及格

使用tr壓縮空格使其變的規則。

[root@xuexi tmp]# cat x.txt | tr -s " "NO Name SubjectID Mark 備忘1 longshuai 001 56 不及格2 gaoxiaofang 001 60 及格3 zhangsan 001 50 不及格4 lisi 001 80 及格5 wangwu 001 90 及格

如果指定SET2,假如替換為"-"。

[root@xuexi tmp]# cat x.txt | tr -s " " "-" NO-Name-SubjectID-Mark-備忘1-longshuai-001-56-不及格2-gaoxiaofang-001-60-及格3-zhangsan-001-50-不及格4-lisi-001-80-及格5-wangwu-001-90-及格

1.5 刪除符號和補集

tr -d是刪除指定的符號,只能接一個SET1。

[root@xuexi tmp]# cat x.txt | tr -d " "NONameSubjectIDMark備忘1longshuai00156不及格2gaoxiaofang00160及格3zhangsan00150不及格4lisi00180及格5wangwu00190及格

tr -c SET1 SET2是將標準輸入按照SET1求補集,並將補集部分的字元全部替換為SET2,即將不在標準輸入中存在但SET1中不存在的字元替換為SET2的字元。但是SET2如果指定的字元大於1個,則只取最後一個字元作為替換字元。使用-c的時候應該把-c SET1作為一個整體,不要將其分開。

例如:

[root@xuexi tmp]# echo "abcdefo"| tr -c "ao" "y"ayyyyyoy[root@xuexi tmp]# 

標準輸入"abcdefo"按照SET1="ao"求得的補集為bcdef,將它們替換為y,結果即為ayyyyyo,但是結果的最後面多了一個y並且緊接著命令提示字元。這是因為abcdefo尾部的\n也是ao的補集的一部分,並將其替換為y了。如果不想替換最後的\n,可以在SET1中指定\n。

[root@xuexi tmp]# echo "abcdefo"| tr -c "ao\n" "y" ayyyyyo

如果SET2指定多個字元,將只取最後一個字元作為替換字元。

[root@xuexi tmp]# echo "abcdefo"| tr -c "ao\n" "ay"ayyyyyo[root@xuexi tmp]# echo "abcdefo"| tr -c "ao\n" "yb"abbbbbo

"-c"常和"-d"一起使用,如tr -d -c SET1。它先執行"-c SET1"求出SET1的補集,再對這個補集執行刪除。也就是說,最終的結果是完全符合SET1中的字元。注意,"-d"一定是放在"-c"前面的,否則被解析為tr -c SET1 SET2,執行的就不是刪除補集,而是替換補集為"-d"的最後一個字元d了。

[root@xuexi tmp]# echo "one 1 two 2 three 3"| tr -d -c "[0-9]\n"     # 對數字和分行符求補集,並刪除這些補集符號123[root@xuexi tmp]# echo "one 1 two 2 three 3"| tr -d -c "[0-9] \n"     # 再加一個空格求補集 1  2  3[root@xuexi tmp]# echo "one 1 two 2 three 3"| tr -c "[0-9]\n" -d      #  -d選項放在-c選項的後面是替換行為dddd1ddddd2ddddddd3[root@xuexi tmp]# echo "one 1 two 2 three 3"| tr -d -c "[a-zA-z]\n"   # 保留字母onetwothree[root@xuexi tmp]# echo "one 1 two 2 three 3"| tr -d -c "[a-zA-z] \n"  # 保留字母的同時保留空格one  two  three

從上面補集的實驗中可以看到,其實指定的[0-9]和[a-z]是一個字元類,最終的結果顯示的是這個類中的對象。

在tr中可以使用以下幾種字元類。這些類也可以用在其他某些命令中。

[:alnum:]所有的數字和字母。
[:alpha:]所有的字母。
[:blank:]所有水平空白=空格+tab。
[:cntrl:]所有控制字元(非列印字元),在ascii表中的八進位0-37對應的字元和177的del。
[:digit:]所有數字。
[:graph:]所有列印字元,不包含空格=數字+字母+標點。
[:lower:]所有小寫字母。
[:print:]所有列印字元,包含空格=數字+字母+標點+空格。
[:punct:]所有標點符號。
[:space:]所有水平或垂直空白=空格+tab+分行符+垂直tab+分頁符+斷行符號鍵。
[:upper:]所有大寫字母。
[:xdigit:]所有十六進位數字。

使用方法例如下面的。例如[:upper:]等價於[A-Z],[:digit:]等價於[0-9]。

[root@xuexi tmp]# echo "one ONE 1 two TWO 2 three THREE 3" | tr -d -c "[:upper:] \n" ONE   TWO   THREE [root@xuexi tmp]# echo "one ONE 1 two TWO 2 three THREE 3" | tr -d -c "[:alpha:] \n"one ONE  two TWO  three THREE [root@xuexi tmp]# echo "one ONE 1 two TWO 2 three THREE 3" | tr -d -c "[:digit:] \n"  1   2   3

回到系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html

轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/7521506.html註:若您覺得這篇文章還不錯請點擊下右下角的推薦,有了您的支援才能激發作者更大的寫作熱情,非常感謝!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.