小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Windows&Unix文件格式解密,空格與tab轉(zhuǎn)換及其相關(guān)工具

 tiantian0521 2007-03-09
該工具只支持在linux下 工具放在網(wǎng)盤和知識庫/work/unix/文字替換

Windows & Unix 文件格式解密, 空格 與 tab 轉(zhuǎn)換及其相關(guān)工具

(轉(zhuǎn)載請保留本文完整信息)
[size=3][b]Windows & Unix 文件格式之迷, 空格 與 tab 轉(zhuǎn)換及其相關(guān)工具[/b][/size]

來自: [url]http://www.[/url]
[email]eybuild@hotmail.com[/email]

關(guān)鍵字: DOS, Unix 文件格式, 空格 與 tab 轉(zhuǎn)換工具
       fbin win2unix tab2unix

摘要: 本文深入揭露 Windows & Unix 格式差異, 及因此而導(dǎo)至的各種問題.
      同時介紹了一些與之相關(guān)的查看和操作工具, 并在 Windows, Unix 進行舉例.

1. 問題提出:
   我們可能會遇到過這樣一些困惑:
   (1) 如何查看一個文件或數(shù)據(jù)流的二進制格式(以十六進制格式顯示)?
   (2) 為什么在 windows下編譯的 shell 腳本在 Unix下不能執(zhí)行?
       為什么在 windows下編輯的 C 源文件在有些 gcc 編譯器下不能編譯?
   (3) 為什么我在 vi 等編器下打開一個文本文件會包含 ^M, 如何把它去掉?
       為什么我在 windows 上用記事本打開 unix上的文件, 文件都不換行?
   (4) 如何刪除文件行尾的 空格 或 tab?
       如何把文件中的 tab 轉(zhuǎn)換成 空格, 或者把 空格 轉(zhuǎn)換成 tab?
       如何只轉(zhuǎn)換行首 tab 轉(zhuǎn)換成 空格?
   ...

2. 分析與方案:

   (1) 如何查看一個文件的二進制格式(以十六進制格式顯示)?
       查看任意文件或數(shù)據(jù)流的二進制格式, 我們非常常用.
       方法一: 在 UtraEdit 使用 Ctrl + H 切換到十六進制編輯模式.
           ** 注意 ** :
           此方法一有缺陷, 它會將行末的單個"換行符"顯示成 "回車" + "換行" 兩個字符.
           這樣會使問題 (2)(3)(4) 無法用此工具正確查看.

       方法二: 使用文件或流的二進制查看工具 fbin
           fbin 可以運行于 windows 和各種 Unix 平臺,
           如下例的命令顯示文件的前48字節(jié):

            $ fbin xx.c 0x30
            filename:  ‘xx.c‘
            filelen :  0x68(104), offset: 0x38, max output: 0x30
            00000000:  2369 6E63 6C75 6465 3C73 7464 696F 2E68    #include<stdio.h
            00000010:  3E0D 0A0D 0A69 6E74 6D61 696E 2829 0D0A    >....intmain()..
            00000020:  7B0D 0A20 2020 2063 6861 7209 2020 2020    {..    char.

           fbin 能準(zhǔn)確顯示文件中的每一個字節(jié). (更多詳細(xì)實例見后文)

   (2) 為什么在 windows下編輯的 shell 腳本在 Unix下不能執(zhí)行?
       為什么在 windows下編輯的 C 源文件在有些 gcc 編譯器下不能編譯?

       原因分析:
           unix 的 shell 腳本不能識別 "回車符" (即: CR, ‘\r‘),
           Windows 文件格式(詳細(xì)分析見下文) 換行時, 總是以 "回車" + "換行"
           (可以借助上一問介紹的 fbin 工具, 查看文件中是否包含 "回車換行" 對),
           導(dǎo)到 unix 下的 shell 無法正常解釋.

       解決方法:
           就是把 windows 格式的中的 "回車" 符刪除, 刪除.

       方法一: 使用 vi 打開源文件, 把 ‘\r\n‘ 替換成 ‘\n‘
           ** 缺點 ** : 不適合大量文件的批量作業(yè).

       方法二: 使用 UtraEdit 把 Windows 格式的文件轉(zhuǎn)換成 Unix 格式.
           (菜單)文件-->轉(zhuǎn)換-->Unix轉(zhuǎn)DOS
           ** 缺點 ** : 不適合大量文件的批量作業(yè).

       方法三: Unix 下的 dos2unix 命令, 如 $ dos2unix -k xx.c
           ** 缺點 ** :
           此方法有一致命缺陷, 它會改變原來的文件屬性.
           如一個可執(zhí)行 shell 腳本的可執(zhí)行屬性及其它屬性, 轉(zhuǎn)換后都將會丟掉
           (即使用 -k 也只是能保留住原來的日期.)
           ** 優(yōu)點 ** : 適合大量普通文件本文件的批量作業(yè).

       方法四: win2unix (windows, unix 均可使用), 功能類似 dos2unix,
           如 win2unx xx.c (更多詳細(xì)實例見后文)
           ** 優(yōu)點**  :
           克服了 dos2unix 的所有缺點(見上), 它能保留源文件的任何屬性.
           還可以返回轉(zhuǎn)換即 unix2win
           適合大量文件的批量作業(yè).

   (3) 為什么我在 vi 等編器下打開一個文本文件會包含 ^M, 如何把它去掉? (見結(jié)論 4, 5)
       為什么我在 windows 上用記事本打開 unix上的文件, 文件都不換行? (見結(jié)論 1)

       原因分析:
           要解決這個問題, 必先弄清 unix 與 windows 文本文件的差異:
           1) 磁盤中 Windows 文本文件總是以 "回車" + "換行"的形式進行換行的.
           2) 磁盤中 Unix 格式的文本文件, 總是以"換行符"(即: LF, ‘\n‘) 換行, 而非 "回車換行符".
              (Unix 規(guī)定: unix 文本文件保存到磁盤時, 總是自動把 "回車換行符" 轉(zhuǎn)換成 "回車符" 保存,
               輸出到終端時由終端自動將將 "回車符" 轉(zhuǎn)換成 "回車換行符" 輸出.)

           ** 容易看出 **:
           Windows 格式的文件換行時, 總是比 Unix格式的文件多一個 "回車" (‘\r‘) 符.

           ** 結(jié)論 1 **:
           這樣在 windows 的記事本中打開 Unix 格式的文件時, 因為文件中沒有 ‘\r‘, 所以無法正常顯示.
           結(jié)果就會把所有的內(nèi)容顯示在同一行中.

           ** 結(jié)論 2 **:
           UtraEdit 等工具會自動檢測文件中是否包含 ‘\r‘, 當(dāng)檢查行末缺少 ‘\r‘時, 一般它會提示
           要求進行 Unix 到 Windows 格式的轉(zhuǎn)換. (相信大家都遇到這個提示信息).

           ** 結(jié)論 3 **:
           UtraEdit 和 vi 等工具, 在保存文件時會自動依照文件原來的格式進行保存. 即:
           如打開的如是 windows 格式它會把文件依然按 windows 格式保存 (不進行自動轉(zhuǎn)換).
           如打開的如是 unix 格式它會把文件依然按 unix 格式保存 (不進行自動轉(zhuǎn)換).

           ** 結(jié)論 4 **:
           向 UtraEdit 打開的 Unix 格式文件中, 通過粘貼板 "粘貼" Windows 格式的若干片斷行時
           (或反之, 即向 Windows 格式文件中, 通過粘貼板 "粘貼" Unix 格式的若干片斷行時),
           代碼片斷中的 "回車換行符" "不會" 自動轉(zhuǎn)換成單個 "換行" 符(反之亦然).
           這樣, 該文件中就會出現(xiàn) "回車符" 與 "回車換行符" 互相夾雜.
           即, 文件中既有單獨的 "回車符" 也有 成對的 "回車換行符".

           ** 結(jié)論 5 **:
           vi 編輯器等, 既能正確顯示"規(guī)則"的 Unix 格式文件, 也能正確顯示"規(guī)則"的 Windows 格式文件,
           但, 對包含單獨的 "回車符", 同時成對的 "回車換行符"的不規(guī)則文件 (產(chǎn)生原因見結(jié)論 4),
           vi 將把回車符以 ^M 的形式顯示.

       解決方法:
           使用類似問題 2 提供的解決方法即可解決, 不再驁述.
           將 unix 轉(zhuǎn)換成 Windows 格式時, 使用 unix2dos 或 win2unix -r(-r 代表反方向)即可.

   (4) 如何刪除文件行尾的 空格 或 tab?
       如何把文件中的 tab 轉(zhuǎn)換成 空格, 或者把 空格 轉(zhuǎn)換成 tab?
       如何只轉(zhuǎn)換行首 tab 轉(zhuǎn)換成 空格?

       問題分析:
           出于各種需要, 特別是編輯 C/C++, Java 等源程序時, 常希望將源文件中的 tab 成空格,
           或?qū)⒖崭褶D(zhuǎn)換成 tab, 同時刪除行尾不必要的空格或 tab 等.
           如果源程序的正文中字符串中包含"空格"或"tab"時, 則只希望只轉(zhuǎn)換行首的"空格"或"tab".

       解決方法:
           如果是單個文件, 直接使用一些編輯器自帶的轉(zhuǎn)換功能轉(zhuǎn)換.
           如果是想批量轉(zhuǎn)換, 不防試試 tab2sp 進行轉(zhuǎn)換, 不僅適合批量文件, 還適合數(shù)據(jù)流.

       方法一: 使用 UtraEdit 的轉(zhuǎn)換功能, 即: (菜單)格式-->轉(zhuǎn)換 TAB 為空格, ...
           ** 缺點 **:
           不適合大量文件的批量作業(yè).

       方法二: tab2sp (適合 windows, 各種 unix 平臺),
           如 tab2sp -t -w8 xx.c (更多詳細(xì)實例見后文)

           ** 優(yōu)點 **:
           適合大量文件的批量作業(yè).
           適應(yīng)文件或流的二進制查看工具 fbin


3. 工具詳解: fbin, win2unix, tab2sp 等對流或文件進行批量查看/轉(zhuǎn)換
   (1) 工具簡介
       fbin, win2unix, tab2sp 等工具對流或文件進行批量查看/轉(zhuǎn)換,
       適合 Windows 和 各種 Unix 平臺.

   (2) fbin - 查看流/文件的二進制格式

       在命令行上鍵入下面命令即可查看在線幫助(部分內(nèi)容未列出)
        $ fbin --help
        fbin - display file with hex format, version 1.0.4
        Copyright(C) eyBuild Group, 2005, 2006. All Rights Reserved.
        [url]http://www.[/url], [email]eybuild@hotmail.com[/email]
        Usage: fbin [options] [fname [0x][offset] [maxlen] | [file1] ...]
           -h --help       - show this help
           -w[num]         - specify word-width [2/4], default 2
           -p              - pause for every screen
           -v              - verbose mode
           -l              - process file list replace ‘fname‘ ...
           fname           - file name to display
           offset          - hex number, ‘0x‘ is optional.
                             offset >= 0 from the begining of input file,
                             offset < 0 from the end of input file
           maxlen          - max length to print

        EXAMPLES:
           win2unix -p foo.bin
        print at most 64 (0x40) bytes from offset 0x200:
           fbin foo.bin 0x200 0x40
        print last 32 (0x20) bytes with 4-bytes word-width:
           fbin -w4 foo.bin -20
        process file list:
           fbin -v -l f1 f2 f3 f4 f5 f6

       例1. 查看一個文件前 64 個字節(jié)二進制:
        (Unix/Windos 執(zhí)行下面命令會得到相同結(jié)果)
        $ fbin fbin.c  0  40
        00000000:  2F2A 2066 6269 6E2E 6320 2D20 6C69 7374    /* fbin.c - list
        00000010:  2066 696C 6520 7769 7468 2062 696E 6E61     file with binna
        00000020:  7279 2066 6F72 6D61 7420 2A2F 0A0A 2F2A    ry format */../*
        00000030:  2043 6F70 7972 6967 6874 2843 2920 6579     Copyright(C) ey

       例2. 查看一個文件最后 64 個字節(jié)二進制:
        (Unix/Windos 執(zhí)行下面命令會得到相同結(jié)果)
        $ fbin fbin.c  -40
        000022D5:  2020 2061 7267 632D 2D2C 2061 7267 762B       argc--, argv+
        000022E5:  2B3B 0A20 2020 2020 2020 2067 6F74 6F20    +;.        goto
        000022F5:  4E45 5854 3B0A 2020 2020 7D0A 0A20 2020    NEXT;.    }..
        00002305:  2072 6574 7572 6E20 4F4B 3B0A 7D0A 0A0A     return OK;.}...

       例3. 查看一個文件從 128 字節(jié)開始的 64 個字節(jié)二進制 (4 字節(jié)寬度):
        (Unix/Windos 執(zhí)行下面命令會得到相同結(jié)果)
        $ fbin -w4 fbin.c 40 40
        00000040:  4275696C  64204772  6F75702C  20323030     Build Group, 200
        00000050:  352C2032  3030362E  20416C6C  20526967     5, 2006. All Rig
        00000060:  68747320  52657365  72766564  2E202A2F     hts Reserved. */
        00000070:  0A0A2F2A  0A6D6F64  69666963  6174696F     ../*.modificatio

       例4.  批量顯示查找(包含子目錄)到的所有文件 (4 字節(jié)寬度):
        Unix 命令:
        $ find ../bin -name "*.exe" | xargs fbin -w4 -l -v |less
        filename:  ‘../bin/csp2bin.exe‘
        filelen :  0x18000(98304)
        00000000:  4D5A9000  03000000  04000000  FFFF0000     MZ..............
        00000010:  B8000000  00000000  40000000  00000000     ........@.......
        00000020:  00000000  00000000  00000000  00000000     ................
        00000030:  00000000  00000000  00000000  E0000000     ................
        00000040:  0E1FBA0E  00B409CD  21B8014C  CD215468     ........!..L.!Th
        00000050:  69732070  726F6772  616D2063  616E6E6F     is program canno
        00000060:  74206265  2072756E  20696E20  444F5320     t be run in DOS
        00000070:  6D6F6465  2E0D0D0A  24000000  00000000     mode....$.......
        00000080:  08A64111  4CC72F42  4CC72F42  4CC72F42     ..A.L./BL./BL./B
        00000090:  37DB2342  4EC72F42  7AE12442  4DC72F42     7.#BN./Bz.$BM./B
        000000A0:  CFDB2142  59C72F42  2ED83C42  4FC72F42     ..!BY./B..<BO./B
        000000B0:  4CC72E42  0FC72F42  7AE12542  26C72F42     L..B../Bz.%B&./B
        000000C0:  52696368  4CC72F42  00000000  00000000     RichL./B........
        000000D0:  00000000  00000000  00000000  00000000     ................
        000000E0:  50450000  4C010300  3642A445  00000000     PE..L...6B.E....
        000000F0:  00000000  E0000F01  0B010600  00000100     ................

        00000100:  00901000  00000000  F5A80000  00100000     ................
        00000110:  00100100  00004000  00100000  00100000     ......@.........
        ...

        Windos 命令如下命令, 會得到相同結(jié)果:
        E:\> for /F %I in (‘dir /w /b /s /A:-D eybuild\bin‘) do fbin -w2 -v -l %I | more

   (3) win2unix - Windows 與 Unix 文件格式互轉(zhuǎn)換工具

       在命令行上鍵入下面命令即可查看在線幫助(部分內(nèi)容未列出)
        $ win2unix --help
        win2unix - translate file between windows and unix format, version 1.0.5
        Usage: win2unix [options] [[src] [dst] | [file1] ...]
           -h --help       - show this help
           -r              - translate file from unix format to windows
           -v              - verbose mode
           -l              - process file list replace ‘src‘ & ‘dst‘ pair
           src             - source file or dectory
           dst             - destination file or dectory

        EXAMPLES:
           win2unix foo.txt
        convert unix to windows format:
           win2unix -r -b src.txt dst.txt
        process file list:
           win2unix -v -l f1 f2 f3 f4 f5 f6


       例1. Unix 格式轉(zhuǎn)換成 Windows 格式:
        $ win2unx -r fbin.c

        查看二進制結(jié)果如下, 與fbin中的"例1"對比容易發(fā)現(xiàn), 第3行中原來的0A0A(兩個"換行符")
        被轉(zhuǎn)換成了 0D0A0D0A (兩對"回車換行符").
        $ fbin fbin.c  0  40
        00000000:  2F2A 2066 6269 6E2E 6320 2D20 6C69 7374    /* fbin.c - list
        00000010:  2066 696C 6520 7769 7468 2062 696E 6E61     file with binna
        00000020:  7279 2066 6F72 6D61 7420 2A2F 0D0A 0D0A    ry format */....
        00000030:  2F2A 2043 6F70 7972 6967 6874 2843 2920    /* Copyright(C)

       例2. Windows 格式轉(zhuǎn)換成 Unix 格式:
        $ win2unx  fbin.c

        查看二進制結(jié)果如下, 與 "例1"對比容易發(fā)現(xiàn), 第3行中原來的0D0A0D0A (兩對"回車換行符")
        被轉(zhuǎn)換成了 0A0A(兩個"換行符")
        $ fbin fbin.c  0  40
        00000000:  2F2A 2066 6269 6E2E 6320 2D20 6C69 7374    /* fbin.c - list
        00000010:  2066 696C 6520 7769 7468 2062 696E 6E61     file with binna
        00000020:  7279 2066 6F72 6D61 7420 2A2F 0A0A 2F2A    ry format */../*
        00000030:  2043 6F70 7972 6967 6874 2843 2920 6579     Copyright(C) ey

       例3. 批量轉(zhuǎn)換查找(包含子目錄)到的所有文件:
        $ find src -name "*.c" | xargs win2unix -l -v
        convert ‘win‘ to ‘unix‘ format ...
        src/csp2bin.c
        src/tab2sp.c
        src/fbin.c
        src/win2unix.c
        ...

        Windos 命令如下命令, 會得到相同結(jié)果:
        E:\> for /F %I in (‘dir /w /b /s /A:-D src/*.c‘) do win2unix -v -l %I


   (4) tab2sp  - tab 與 空格的互轉(zhuǎn)換

       在命令行上鍵入下面命令即可查看在線幫助(部分內(nèi)容未列出)
        $ win2unix --help
        tab2sp - convert tabs to spaces or revert, version 1.0.2
        Usage: tab2sp [options] [[src] [dst] | [file1] ...]
           -h --help       - show this help
           -r              - convert spaces to tabs
           -p              - only convert line prefixed spaces or tabs
           -t              - remove tail tabs and spaces
           -w[num]         - specify tab width [1-8], default 4
           -no             - don‘t do any convert
           -v              - verbose mode
           -l              - process file list replace ‘src‘ & ‘dst‘ pair
           src             - source file
           dst             - destination file

        EXAMPLES:
           tab2sp -r < foo.txt
        convert tabs to spaces:
           tab2sp foo.txt
        convert spaces to tabs and remove tail tabs, spaces:
           tab2sp -r -t foo.txt
        only remove tail tabs and spaces:
           tab2sp -no -t foo.txt
        process file list:
           tab2sp -v -l f1 f2 f3 f4 f5 f6

       例1. 將文件中的所 tab 轉(zhuǎn)換成 "空格"(默認(rèn) 4 字符寬度), 并刪除尾部 tab 和空格:
        $ tab2sp -t fbin.c

        可自行用 fbin 查看二進制結(jié)果如下, 確認(rèn)是否 tab(09) 全部轉(zhuǎn)成成了空格(20).
        本處不再把示例結(jié)果列出.

       例2. 將文件中的所 "空格" 轉(zhuǎn)換成 tab (默認(rèn) 4 字符寬度), 并刪除尾部 tab 和空格:
        $ tab2sp -r -t fbin.c

       例3. 將文件中的所 tab 轉(zhuǎn)換成空格(指定為 8 字符寬度), 并刪除尾部 tab 和空格:
        $ tab2sp -t -w8 fbin.c

       例4. 只刪除文件 f1, f2, f3 f4 行尾的空格
        $ tab2sp -no -t -l f1 f2 f3 f4

       例5. 只轉(zhuǎn)換行首 tab 為空格(指定為 8 字符寬度), 并刪除尾部 tab 和空格:
        $ tab2sp -p -t -l f1 f2 f3 f4

       例6. 批量轉(zhuǎn)換查找(包含子目錄)到的所有文件, 命令可以自由組合:
        $ find src -name "*.c" | xargs tab2sp -l -v -w8 -p
        convert ‘tab‘ to ‘space‘ format ...
        src/csp2bin.c
        src/tab2sp.c
        src/fbin.c
        src/win2unix.c
        ...

        Windos 命令如下命令, 會得到相同結(jié)果:
        E:\> for /F %I in (‘dir /w /b /s /A:-D src/*.c‘) do tab2sp -l -v -w8 -p %I

工具下載地址:
[url]http://www.[/url]
[url]http://www./develop/download/fbin_win2unx_tab2sp-linux.tar.gz[/url]   [linux 格式]
[url]http://www./develop/download/fbin_win2unx_tab2sp-linux.tar.gz[/url]   [windos 格式]

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多