一、顯示文件中的控制字符
當從其他系統下載文件時,有時要刪除整個文件的控制字符(非打印字符),從菜單中捕獲一個應用的屏幕輸出有時也會將控制字符輸出進文件,怎樣知道文件中是否有控制字符?使用cat-vfilename命令,屏幕會亂叫,且到處都是一些垃圾字符,這可以確知文件中包含有控制字符,如果有興趣可以觀察一下這些字符以便於更加確認它們是控制字符。一些系統中使用catfilename而不是cat-v來查看非打印字符。
sed格式為:[address,[address]]l‘l’意為列表。
一般情況下要列出整個文件,而不是模式匹配行,因此使用l要從第一到最後一行。模式范圍1,$即為此意。
如果cat一個文件,發現實際上包含有控制字符。
$cat –v a.txt
This is the F1 key:^[OP
This is the F2 key:^[OQ
現在運行sed命令,觀察輸出結果。
$sed –n '1,$l' a.txt
This is the F1 key:\033OP$
This is the F2 key:\033OQ$
$
sed找到並顯示了兩個控制字符。\033代表退格鍵,OP為F1鍵值,放在退格鍵後。第二行也是如此。各系統控制字符鍵值可能不同,主要取決於其映射方式(例如使用terminfo或termcap)。
如果要在文本文件中插入控制字符F1鍵,使用vi查看其鍵值,操作如下:
•啟動vi。
•進入插入模式。
•按下<Ctrl>鍵,然後按<v>鍵(出現a^)。
•釋放上述兩個鍵。
•按下F1鍵(顯示[OP]。
•按下<ESC>鍵(顯示F1鍵值)。
二、處理控制字符
處理這樣的控制字符有兩種辦法(但不一定滿足所有情況,具體情況具體實現吧)。
第一種:直接執行dos2unixa.txt (這只可以處理dos到unix下的換行問題)
第二種:使用sed剔除控制字符。
下面是傳送過來的文件(dos.txt)的部分腳本。必須去除所有可疑字符,以便於帳號所有者使用文件。
$ cat -v dos.txt
12332##DISO##45.12^M
00332##LPSO##23.14^M
01299##USPD##34.16^M
可采取以下動作:
1)用一個空格替換所有的(##)符號。
2)刪除起始域中最前面的0(00)。
3)刪除行尾控制字符(^M)。
一些系統中,回車符為^@和^L,如果遇到一些怪異的字符,不必擔心,只要是在行尾並且全都相同就可以。按步執行每一項任務,以保證在進行到下一任務前得到理想結果。使用輸入文件dos.txt。
任務1。刪除所有的#字符很容易,可以使用全局替換命令。這裡用一個空格替換兩個或更多的#符號。
$ sed 's/##*/ /g' dos.txt | cat -v
12332 DISO 45.12^M
00332 LPSO 23.14^M
01299 USPD 34.16^M
任務2。刪除所有行首的0。使用^符號表示模式從行首開始,^0*表示行首任意個0。模式s/^0*//g設置替換部分為空,即為刪除模式,正是要求所在。
$ sed 's/^0*/ /g' dos.txt | cat -v
12332##DISO##45.12^M
332##LPSO##23.14^M
1299##USPD##34.16^M
任務3。最後去除行尾^M符號,為此需做全局替換。設置替換部分為空。模式為:‘s/^m//g’,注意‘^M’,這是一個控制字符。要產生控制字符(^M),需遵從前面產生F1鍵同樣的處理過程。步驟如下;鍵入seds/,然後按住<Ctrl>鍵和v鍵,釋放v鍵,按<return>鍵。下面命令去除行尾^M字符。
$ sed 's/^M//g' dos.txt | cat -v
12332##DISO##45.12
00332##LPSO##23.14
01299##USPD##34.16
分步測試預想功能對理解整個過程很有幫助。用sed在移到下一步前測試本步功能及結果很重要。如果不這樣,可能會有一大堆包含怪異字符的意料外的結果。