Dos2unix 在 macos 和 centos 上的行为不同?

Dos2unix 在 macos 和 centos 上的行为不同?

我有一个文件需要转换为 unix 格式,所以我正在执行dos2unix filename.txt。但是与 macOS 格式相比,转换后的文件格式在 CentOS 上有所不同。

我曾尝试更新dos2unixcentos 上的版本,但没有帮助。

CentOS:

dos2unix -V
dos2unix 3.1 (Thu Nov 19 1998)

苹果系统:

dos2unix -V
dos2unix 7.4.0 (2017-10-10)
With Unicode UTF-16 support.
Without native language support.

原始文件格式:

<?xml version="1.0" encoding="utf-8"?>
<ACES version="3.0">
  <Header>
    <Company>Disc Brakes Australia</Company>
    <SenderName>SEMA Data Co-op</SenderName>
    <SenderPhone>888-958-6698 option 2</SenderPhone>
    <TransferDate>2019-03-21</TransferDate>
    <BrandAAIAID>DMWK</BrandAAIAID>
    <DocumentTitle>SDC ACES XML File</DocumentTitle>
    <EffectiveDate>2019-03-21</EffectiveDate>
    <SubmissionType>FULL</SubmissionType>
    <VcdbVersionDate>2019-02-22</VcdbVersionDate>
    <QdbVersionDate>2019-02-22</QdbVersionDate>
    <PcdbVersionDate>2019-02-22</PcdbVersionDate>
  </Header>
  <App action="A" id="1">
    <BaseVehicle id="119723" />
    <SubModel id="973" />
    <EngineBase id="6067" />
    <Region id="3" />
    <Qty>2</Qty>
    <PartType id="1896" />
    <MfrLabel>T3 5000 Series T-Slot Slotted Rotor, Black Hat Test label 1</MfrLabel>
    <Position id="22" />
    <Part>DBA52120BLKS</Part>
  </App>
  <App action="A" id="2">
    <BaseVehicle id="119723" />
    <SubModel id="973" />
    <EngineBase id="3930" />
    <Region id="1" />
    <Qty>2</Qty>
    <PartType id="1896" />
    <MfrLabel>T3 5000 Series T-Slot Slotted Rotor, Black Hat Test label 2</MfrLabel>
    <Position id="22" />
    <Part>DBA52120BLKS</Part>
  </App>
  <Footer>
    <RecordCount>2</RecordCount>
  </Footer>
</ACES>

m-c02xd0nmjgh7:test files s0c03h1$ od -bc FileName.XML | head -10
0000000   357 273 277 074 077 170 155 154 040 166 145 162 163 151 157 156
         357 273 277   <   ?   x   m   l       v   e   r   s   i   o   n
0000020   075 042 061 056 060 042 040 145 156 143 157 144 151 156 147 075
           =   "   1   .   0   "       e   n   c   o   d   i   n   g   =
0000040   042 165 164 146 055 070 042 077 076 015 012 074 101 103 105 123
           "   u   t   f   -   8   "   ?   >  \r  \n   <   A   C   E   S
0000060   040 166 145 162 163 151 157 156 075 042 063 056 060 042 076 015
               v   e   r   s   i   o   n   =   "   3   .   0   "   >  \r
0000100   012 040 040 074 110 145 141 144 145 162 076 015 012 040 040 040
          \n           <   H   e   a   d   e   r   >  \r  \n

转换后的Macos文件格式:

m-c02xd0nmjgh7:test files s0c03h1$ dos2unix FileName.XML
dos2unix: converting file FileName.XML to Unix format...
m-c02xd0nmjgh7:test files s0c03h1$ od -bc FileName.XML | head -10
0000000   074 077 170 155 154 040 166 145 162 163 151 157 156 075 042 061
           <   ?   x   m   l       v   e   r   s   i   o   n   =   "   1
0000020   056 060 042 040 145 156 143 157 144 151 156 147 075 042 165 164
           .   0   "       e   n   c   o   d   i   n   g   =   "   u   t
0000040   146 055 070 042 077 076 012 074 101 103 105 123 040 166 145 162
           f   -   8   "   ?   >  \n   <   A   C   E   S       v   e   r
0000060   163 151 157 156 075 042 063 056 060 042 076 012 040 040 074 110
           s   i   o   n   =   "   3   .   0   "   >  \n           <   H
0000100   145 141 144 145 162 076 012 040 040 040 040 074 103 157 155 160
           e   a   d   e   r   >  \n                   <   C   o   m   p

转换后的Centos文件格式:

-bash-4.1$ dos2unix output.txt
dos2unix: converting file output.txt to UNIX format ...
-bash-4.1$ od -bc output.txt | head -10
0000000 357 273 277 074 077 170 155 154 040 166 145 162 163 151 157 156
        357 273 277   <   ?   x   m   l       v   e   r   s   i   o   n
0000020 075 042 061 056 060 042 040 145 156 143 157 144 151 156 147 075
          =   "   1   .   0   "       e   n   c   o   d   i   n   g   =
0000040 042 165 164 146 055 070 042 077 076 012 074 101 103 105 123 040
          "   u   t   f   -   8   "   ?   >  \n   <   A   C   E   S    
0000060 166 145 162 163 151 157 156 075 042 063 056 060 042 076 012 040
          v   e   r   s   i   o   n   =   "   3   .   0   "   >  \n    
0000100 040 074 110 145 141 144 145 162 076 012 040 040 040 040 074 103
              <   H   e   a   d   e   r   >  \n                   <   C

我想要获得unix2dos与上面显示的 Mac 相同的结果。

答案1

357 273 277是八进制表示UTF-8 中的 BOM(字节顺序标记)。原始文件带有 BOM。在您的某个系统中将dos2unix其删除。

在我的 Debian 中man 1 dos2unix说:

-b,--keep-bom
保留字节顺序标记 (BOM)。当输入文件有 BOM 时,在输出文件中写入 BOM。[…]

[…]

-r,--remove-bom
删除字节顺序标记 (BOM)。不要在输出文件中写入 BOM。[…]

如果您有相同(或类似)的可用选项,请使用它们。例如:

dos2unix -r FileName.XML

但是你dos2unix使用的 CentOS 已经非常老旧了(1998-11-19?超过 20 年了!考虑到第一个 CentOS 版本是在 2004 年发布的,这就更加尴尬了)。变更日志-r-b于 2014-07-07 添加。获取更新的dos2unix

或者寻找bomstrip。我的 Debian 中的软件包描述bomstrip是:

Bomstrip 是一款非常简单的工具,可从 UTF-8 文件中删除 BOM(字节顺序标记)。UTF-8 没有字节顺序问题,因此完全没有必要使用三个字节(UTF-8-BOM)来表示字节顺序(因为没有什么可说的)。

相关内容