利用cat -v去除文件中的不可見特殊字符

  • 本文雖然針對(duì)的是特殊字符“^@”,但對(duì)于其他不可見的特殊字符依然適用。核心思想就是利用cat -v將不可見字符轉(zhuǎn)變?yōu)榭梢娮址梢娮址强梢岳酶鞣N命令處理的。

  • 今天處理一個(gè)文件的時(shí)候發(fā)現(xiàn)文件中字符間夾雜著特殊字符“^@”,這些特殊字符常態(tài)下是看不見的,但是可能會(huì)引發(fā)程序運(yùn)行問題。此文件是從windows SQL Server中導(dǎo)出的數(shù)據(jù),并傳到Linux上來進(jìn)行處理了。可以使用cat -v查看不可打印字符:

    #看似正常
    [root@localhost]/home/NEW_HW1# head OLD.ZIP-SHEGONG 
    !@#qweasd412
    19960718.+0.
    513321262@qq.com
    qqq3356273
    13260362351
    wucheng25
    ZHAOGANG55555
    zl13994178341
    ytmfnia
    qaz911018
    #查看不可打印字符
    [root@localhost]/home/NEW_HW1# head OLD.ZIP-SHEGONG | cat -v
    ^@!^@@^@#^@q^@w^@e^@a^@s^@d^@4^@1^@2^@
    ^@1^@9^@9^@6^@0^@7^@1^@8^@.^@+^@0^@.^@
    ^@5^@1^@3^@3^@2^@1^@2^@6^@2^@@^@q^@q^@.^@c^@o^@m^@
    ^@q^@q^@q^@3^@3^@5^@6^@2^@7^@3^@
    ^@1^@3^@2^@6^@0^@3^@6^@2^@3^@5^@1^@
    ^@w^@u^@c^@h^@e^@n^@g^@2^@5^@
    ^@Z^@H^@A^@O^@G^@A^@N^@G^@5^@5^@5^@5^@5^@
    ^@z^@l^@1^@3^@9^@9^@4^@1^@7^@8^@3^@4^@1^@
    ^@y^@t^@m^@f^@n^@i^@a^@
    ^@q^@a^@z^@9^@1^@1^@0^@1^@8^@
    
  • 查看文件類型
    可以發(fā)現(xiàn)文件類型是data,根據(jù)man手冊(cè),data是file命令不能識(shí)別的文件類型

    [root@localhost]/home/NEW_HW1# file OLD.ZIP-SHEGONG 
    OLD.ZIP-SHEGONG: data
    
  • dos2unix 命令無效

  • 去除特殊字符^@

    特殊字符^@并不是兩個(gè)字符,而是一個(gè)字符,一個(gè)使用“ctrl+V ctrl+@”才能打出來的字符。
    網(wǎng)上提供了幾種辦法,但是沒有解決問題:

    # 方法1
    [root@localhost]/home/NEW_HW1# head OLD.ZIP-SHEGONG | tr -d '^@' | cat -v         
    ^@!^@^@#^@q^@w^@e^@a^@s^@d^@4^@1^@2^@
    ^@1^@9^@9^@6^@0^@7^@1^@8^@.^@+^@0^@.^@
    ^@5^@1^@3^@3^@2^@1^@2^@6^@2^@^@q^@q^@.^@c^@o^@m^@
    ^@q^@q^@q^@3^@3^@5^@6^@2^@7^@3^@
    ^@1^@3^@2^@6^@0^@3^@6^@2^@3^@5^@1^@
    ^@w^@u^@c^@h^@e^@n^@g^@2^@5^@
    ^@Z^@H^@A^@O^@G^@A^@N^@G^@5^@5^@5^@5^@5^@
    ^@z^@l^@1^@3^@9^@9^@4^@1^@7^@8^@3^@4^@1^@
    ^@y^@t^@m^@f^@n^@i^@a^@
    ^@q^@a^@z^@9^@1^@1^@0^@1^@8^@
    # 方法2
    [root@localhost]/home/NEW_HW1# head OLD.ZIP-SHEGONG | sed 's/\^@//g' | cat -v  
    ^@!^@@^@#^@q^@w^@e^@a^@s^@d^@4^@1^@2^@
    ^@1^@9^@9^@6^@0^@7^@1^@8^@.^@+^@0^@.^@
    ^@5^@1^@3^@3^@2^@1^@2^@6^@2^@@^@q^@q^@.^@c^@o^@m^@
    ^@q^@q^@q^@3^@3^@5^@6^@2^@7^@3^@
    ^@1^@3^@2^@6^@0^@3^@6^@2^@3^@5^@1^@
    ^@w^@u^@c^@h^@e^@n^@g^@2^@5^@
    ^@Z^@H^@A^@O^@G^@A^@N^@G^@5^@5^@5^@5^@5^@
    ^@z^@l^@1^@3^@9^@9^@4^@1^@7^@8^@3^@4^@1^@
    ^@y^@t^@m^@f^@n^@i^@a^@
    ^@q^@a^@z^@9^@1^@1^@0^@1^@8^@
    
    
  • 試了網(wǎng)上的方法,沒有成功,思考片刻,靈機(jī)一動(dòng),解決了問題:

    # 先使用cat -v將不可見字符轉(zhuǎn)為可見字符再轉(zhuǎn)換不就可以了嗎
    # 注意,因?yàn)檗D(zhuǎn)變?yōu)榱丝梢娮址証@成為了兩個(gè)字符^和@
    [root@localhost]/home/NEW_HW1# head OLD.ZIP-SHEGONG | cat -v | tr -d '^@' | cat -v
    !#qweasd412
    19960718.+0.
    513321262qq.com
    qqq3356273
    13260362351
    wucheng25
    ZHAOGANG55555
    zl13994178341
    ytmfnia
    qaz911018
    # or 
    [root@localhost]/home/NEW_HW1# head OLD.ZIP-SHEGONG | cat -v | sed 's/\^@//g' | cat -v
    !@#qweasd412
    19960718.+0.
    513321262@qq.com
    qqq3356273
    13260362351
    wucheng25
    ZHAOGANG55555
    zl13994178341
    ytmfnia
    qaz911018
    
    
  • 進(jìn)行真正的轉(zhuǎn)換

    [root@localhost]/home/NEW_HW1# cat -v OLD.ZIP-SHEGONG | tr -d '^@' > t     
    # Everything is OK
    [root@localhost]/home/NEW_HW1# du -mh t
    1.1G    t
    [root@localhost]/home/NEW_HW1# du -mh OLD.ZIP-SHEGONG 
    2.2G    OLD.ZIP-SHEGONG
    # 文件類型也被file命令識(shí)別了
    [root@localhost]/home/NEW_HW1# file t
    t: ASCII text
    [root@localhost]/home/NEW_HW1# head -2 t | cat -v
    !#qweasd412
    19960718.+0.
    
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容