shell命令_tr基礎

關於tr

去除^M部分還需要驗證......
t r用來從標準輸入中通過替換或刪除操作進行字符轉換。t r主要用於刪除文件中控制字符或進行字符轉換。使用t r時要轉換兩個字符串:字符串1用於查詢,字符串2用於處理各種轉換。
t r剛執行時,字符串1中的字符被映射到字符串2中的字符,然後轉換操作開始
下面講述:
引用:
? 大小寫轉換。
? 去除控制字符。
? 刪除空行。


帶有最常用選項的t r命令格式爲:
代碼:
t r - c - d - s [ " s t r i n g 1 _ t o _ t r a n s l a t e _ f r o m " ] [ " s t r i n g 2 _ t o _ t r a n s l a t e _ t o " ] i n p u t _f i l e


這裏:
引用:
-c 用字符串1中字符集的補集替換此字符集,要求字符集爲A S C I I。
-d 刪除字符串1中所有輸入字符。
-s 刪除所有重複出現字符序列,只保留第一個;即將重複出現字符串壓縮爲一個字符串。

I n p u t - f i l e是轉換文件名。雖然可以使用其他格式輸入,但這種格式最常用。

字符範圍
使用t r時,可以指定字符串列表或範圍作爲形成字符串的模式。這看起來很像正則表達式,但實際上不是。指定字符串1或字符串2的內容時,只能使用單字符或字符串範圍或列表。
引用:
[a-z] a-z內的字符組成的字符串。
[A-Z] A-Z內的字符組成的字符串。
[0-9] 數字串。
/octal 一個三位的八進制數,對應有效的A S C I I字符。
[O*n] 表示字符O重複出現指定次數n。因此[ O * 2 ]匹配O O的字符串。
大部分t r變種支持字符類和速記控制字符。
字符類格式爲[:c l a s s ],包含數字、希臘字母、空行、小寫、大寫、c n t r l鍵、空格、點記符、圖形等等。


下表包括最常用的控制字符的速記方式及三位八進制引用方式。
當用一個單字符替換一個字符串或字符範圍時,注意字符並不放在方括號裏( [ ])。一些系統也可以使用方括號,例如可以寫成[“/ 0 1 2”]或“/ 0 1 2”,t r也允許不加引號,因此命令中看到單引號而不是雙引號時也不要感到奇怪。
像大多數系統工具一樣, t r也受特定字符的影響。因此如果要匹配這些字符,需使用反斜線屏蔽其特殊含義。例如,用/ {指定花括號左邊可以屏蔽其特殊含義。

tr中特定控制字符的不同表達方式
代碼:
速記符含義八進制方式
/ a Ctrl-G 鈴聲/ 0 0 7
/ b Ctrl-H 退格符/ 0 1 0
/f Ctrl-L 走行換頁/ 0 1 4
/n Ctrl-J 新行/ 0 1 2
/ r Ctrl-M 回車/ 0 1 5
/t Ctrl-I tab鍵/ 0 11
/ v Ctrl-X / 0 3 0

去除重複出現的字符
下面文件包含了一些打印錯誤。這種情況時常發生,例如在v i編輯器中,偶爾按住一個鍵不放。
代碼:
[sam@chenwy split]$ cat opps.txt
And the cowwwwws went homeeeeeeeeeeeee
Or did theyyyyyyyyyyyyy


如果要去除重複字母或將其壓縮在一起,使用- s選項。因爲都是字母,故使用[ a - z ]。輸入文件重定向到t r命令。
代碼:
[sam@chenwy split]$ tr -s "[a-z]" < opps.txt
And the cows went home
Or did they


所有重複字符被壓縮成一個。如果使用c a t命令,再將結果管道輸出至t r,結果是一樣的。
代碼:
[sam@chenwy split]$ cat opps.txt | tr -s "[a-z]"
And the cows went home
Or did they


刪除空行
要刪除空行,可將之剔出文件。下面是一個文件p l a n e . t x t。文本間有許多空行。
代碼:
[sam@chenwy split]$ cat plane.txt
plane.txt
9879932 Spitfire

 


190992 Lancaster

 


238991 Typhoon


使用- s來做這項工作。換行的八進制表示爲/ 0 1 2,命令爲:
代碼:
[sam@chenwy split]$ tr -s "[/012]" < plane.txt
plane.txt
9879932 Spitfire
190992 Lancaster
238991 Typhoon


也可以使用換行速記方式/ n。
代碼:
[sam@chenwy split]$ tr -s "[/n]" < plane.txt
plane.txt
9879932 Spitfire
190992 Lancaster
238991 Typhoon


大寫到小寫
除了刪除控制字符,轉換大小寫是t r最常用的功能。爲此需指定即將轉換的小寫字符[ a - z ]和轉換結果[ A - Z ]。
第一個例子,t r從一個包含大小寫字母的字符串中接受輸入。
代碼:
[sam@chenwy split]$ echo "May Day,May Day,Going Down.." | tr "[a-z]" "[A-Z]"
MAY DAY,MAY DAY,GOING DOWN..


同樣,也可以使用字符類[:l o w e r:]和[:u p p e r:]。
代碼:
[sam@chenwy split]$ echo "May Day,May Day,Going Down.." | tr "[:lower:]" "[:upper:]"
MAY DAY,MAY DAY,GOING DOWN..


刪除指定字符
偶爾會從下載文件中刪除只包含字母或數字的列。需要結合使用- c和- s選項完成此功能。
下面的文件包含一個星期的日程表。任務是從其中刪除所有數字,只保留日期。日期有大寫,也有小寫格式。因此需指定兩個字符範圍[ a - z ]和[ A - Z ],命令tr -cs "[a-z][A-Z]""[/012*]"將文件每行所有不包含在[ a - z ]或[ A - Z ](所有希臘字母)的字符串放在字符串1中並轉換爲一新行。- s選項表明壓縮所有新行, - c表明保留所有字母不動。原文件如下,後跟t r命令:
代碼:
[sam@chenwy split]$ cat diary.txt
mondy 10:50
Tuesday 15:00
wednesday 15:30
thurday 10:30
Fridya 09:20


代碼:
[sam@chenwy split]$ tr -cs "[a-z][A-Z]" "[/012*]" <diary.txt
mondy
Tuesday
wednesday
thurday
Fridya


轉換控制字符
t r的第一個功能就是轉換控制字符,特別是從d o s向U N I X下載文件時,忘記設置f t p關於回車換行轉換的選項時更是如此。
下面是故意沒有設置轉換開關的一個文本文件,是關於文具需求的一部分內容。使用c a t- v顯示控制字符。
代碼:
[sam@chenwy split]$ cat -v stat.tr
Boxes paper     12^M
Clips metal     50^M
Pencils-meduim  10^M
^Z


猜想‘中間空的是’是t a b鍵。每一行以C t r l - M結尾,文件結尾C t r l - Z,以下是改動方法。
使用- s選項,查看A S C I I表。^的八進制代碼是1 3 6,^ M是0 1 5,t a b鍵是0 11,^ Z是0 3 2 ,下面將按步驟完成最終功能。

用新行替換每行末尾的^ M,並用/ n去除^ Z,輸入要來自於臨時工作文件s t a t . t m p。將結果重定向到臨時工作文件s t a t . t m p。
代碼:
[sam@chenwy split]$ tr -s "[/015][/032]" "/n" <stat.tr >stam.tmp
[sam@chenwy split]$ cat -v stam.tmp
Boxes paper     12
Clips metal     50
Pencils-meduim  10


快速轉換
如果需要刪除文件中^ M,並代之以換行。使用命令:
代碼:
[sam@chenwy split]$ tr -s "[/015]" "/n" < stat.tr |cat -v
Boxes paper     12
Clips metal     50
Pencils-meduim  10
^Z


或者用下述命令得同樣結果。
代碼:
[sam@chenwy split]$ tr -s "[/032]" "/n" < stat.tr >stat1.tr
[sam@chenwy split]$ cat stat1.tr
Boxes paper     12
Clips metal     50
Pencils-meduim  10


也可以用下述命令:
代碼:
[sam@chenwy split]$ tr -s "[/r]" "/n" < stat.tr


代碼:
[sam@chenwy split]$ tr -s "/r" "/n" < stat.tr 
 

要刪除所有的t a b鍵,代之以空格,使用命令:
代碼:
[sam@chenwy split]$ tr -s "[1]" "[0*]" < stat.tr >temp.txt
[sam@chenwy split]$cat -v temp.txt
Boxes paper 12^M
Clips metal 50^M
Pencils-meduim 10^M
^Z


替換p a s s w d文件中所有冒號,代之以t a b鍵,可以增加可讀性。將冒號引起來,指定替換字符串中t a b鍵八進制值0 11,下面是p a s s w d文件,後跟t r命令結果:
代碼:
[sam@chenwy split]$ tr -s "[:]" "[/t]" < passwd
root    x       0       0       root    /root   /bin/bash
bin     x       1       1       bin     /bin    /sbin/nologin
daemon  x       2       2       daemon  /sbin   /sbin/nologin
.....................



代碼:
[sam@chenwy split]$ tr -s "[:]" "[1]" < passwd


匹配多於一個字符
可以使用[ c h a r a c t e r * n ]格式匹配多於一個字符。下述文件列出系統硬盤信息,其中包含了系統已經註冊的和未識別的。第一列是數字,如果不全是0,表明第二列相應硬盤已經註冊。
有時全部爲0看起來很煩人,找個吸引人注意力的符號來代替它,以便一眼就能看出哪個硬盤已註冊,哪個不可識別。原文件如下:
代碼:
[sam@chenwy split]$ cat hdisk.txt
15566 hdisk3
456554 hdisk2
0000 hdisk1


從文件列表中知道,有一個硬盤未註冊,因此用星號代替所有的0。模式爲[ 0 * 4 ],意即匹配至少4個0,替換字符串爲星號,過濾命令及結果如下:
代碼:
[sam@chenwy split]$ tr "[0*4]" "*" < hdisk.txt
15566 hdisk3
456554 hdisk2
**** hdisk1


但我發現加上[]後結果不對了
代碼:
[sam@chenwy split]$ tr "[0*4]" "[*]" < hdisk.txt
15566 hdisk3
456554 hdisk2
]]]] hdisk1

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章