Shell 亂碼 檔案中的控制字元處理

2021-06-03 23:14:28 字數 2412 閱讀 7053

shell亂碼檔案中的控制字元處理

一、顯示檔案中的控制字元

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)。

•啟動vi。

•進入插入模式。

•按下鍵,然後按鍵(出現a^)。

•釋放上述兩個鍵。

•按下f1鍵(顯示[op]。

•按下鍵(顯示f1鍵值)。

二、處理控制字元

處理這樣的控制字元有幾種辦法(但不一定滿足所有情況,具體情況具體實現吧)。

方法一:直接執行 dos2unix a.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/,然後按住鍵和v鍵,釋放v鍵,按鍵。下面命令去除行尾^m字元。

$  sed 's/^m//g' dos.txt | cat -v

12332##diso##45.12

00332##lpso##23.14

01299##uspd##34.16

分步測試預想功能對理解整個過程很有幫助。用sed在移到下一步前測試本步功能及結果很重要。如果不這樣,可能會有一大堆包含怪異字元的意料外的結果。

方法三:使用sed剔除控制字元。

車換行轉換的選項時更是如此。

下面是故意沒有設定轉換開關的乙個文字檔案,是關於文具需求的一部分內容。使用cat -v顯示控制字元。

$  cat -v dos.txt

12332^^##diso##45.12^m

00332^^##lpso##23.14^m

01299^^##uspd##34.16^m

猜想^^^^^^是tab鍵。每一行以ctrl -m結尾,檔案結尾ctrl -z,以下是改動方法。

使用man ascii命令,檢視ascii表。^的八進位制**是136,^m是015,tab鍵是011,^z是032 ,下面將按步驟完成最終功能。

$  tr -s "[^^]" "[\011*]" < dos.txt  | tr -s "[\015]" "[\012*]" | tr -s "[##]" " " | cat -v

12332    diso 45.12

00332    lpso 23.14

01299    uspd 34.16

Unix的控制字元

控制字元 修改終端或文字顯示的行為.控制字元以control key 組合.控制字元在指令碼中不能正常使用.ctl b游標後退,這應該依賴於bash 輸入的風格,預設是emacs 風格的.ctl cbreak,終止前台工作.ctl d從當前shell 登出 和exit 很像 eof 檔案結束符 這也...

字元中包含不顯示的控制字元

碰到乙個unicode字符集的問題,記錄一下 拷貝了乙個手機號直接貼上到平台 儲存,結果傳送簡訊時該手機號接收不到,網上查了才知道原來拷貝到手機號包含了不顯示unicode字元 u202d 一般用到unicode 控制字元有 1 rlo code u202e html 開始從右到左的文字 2 lro...

刪除字串中的控制字元(python)

要刪除字串中的控制字元,因為無符號控制字元不能夠在xml中編碼,諸如 b 轉換成 x02 如果作為內容寫入xml,會導致xml錯誤,所以需要把控制字元刪除。python 如下 方法 一 def strip control characters str input if str input impor...