dos2unixで改行コードの変換

7-1.ファイル・アーカイブ
ドラマCD伝説のはじまりTVスポット 掛け合いver.

アニメ『みつどもえ』(2010)
動画は、ドラマCDのPVです。まったく似てない三つ子三姉妹のギャクアニメ。引いてしまうところもあるのですが、慣れかなあと思います。

みつどもえと言えば、WindowsとMAC、それにLinux。

それぞれ別OSではありますが、コマンドラインの原点であるUNIXと全然縁がないわけではないんです。
LinuxはUNIXライクなOS、一方でMacは完全なUNIX。Windows10ではWSL(Windows Subsystem for Linux)を導入しました。
つまりこの3つのOS全てで、本ブログでさんざん勉強しているコマンドが使えるってことなります。

コマンドで処理したいことといえば、テキスト整形が第一に考え及びますが、テキストに関しては各OS注意が必要です。すこし前まで改行コードは、その昔、三OS三様でした。
LinuxはUNIXと同じく、改行コードはLF(0x0A)、WindowsはCRLF(0x0D,0x0A)、MacはCR(0x0D)。

でもでも今やMacはUNIXなので、改行コードもLF(0x0A)です。Mac/LinuxとWindowsとの改行の差を考えれば良いだけです。

では改行コードの変換コマンドdos2unixを使ってみます。
それぞれインストールしてみましょう。

Linuxの場合

takk~$ sudo apt install dos2unix

Linuxにてman dos2unixの冒頭部分。

dos2unix(1)                       2017-10-10                       dos2unix(1)

NAME
       dos2unix - DOS/Mac to Unix and vice versa text file format converter

SYNOPSIS
           dos2unix [options] [FILE ...] [-n INFILE OUTFILE ...]
           unix2dos [options] [FILE ...] [-n INFILE OUTFILE ...]

DESCRIPTION
       The Dos2unix package includes utilities "dos2unix" and "unix2dos" to
       convert plain text files in DOS or Mac format to Unix format and vice
       versa.

       In DOS/Windows text files a line break, also known as newline, is a
       combination of two characters: a Carriage Return (CR) followed by a
       Line Feed (LF). In Unix text files a line break is a single character:
       the Line Feed (LF). In Mac text files, prior to Mac OS X, a line break
       was single Carriage Return (CR) character. Nowadays Mac OS uses Unix
       style (LF) line breaks.

Macの場合

takk~$ brew install dos2unix

Macでもman dos2unixの冒頭。

dos2unix(1)                       2019-09-24                       dos2unix(1)

NAME
       dos2unix - DOS/Mac to Unix and vice versa text file format converter

SYNOPSIS
           dos2unix [options] [FILE ...] [-n INFILE OUTFILE ...]
           unix2dos [options] [FILE ...] [-n INFILE OUTFILE ...]

DESCRIPTION
       The Dos2unix package includes utilities "dos2unix" and "unix2dos" to
       convert plain text files in DOS or Mac format to Unix format and vice
       versa.

       In DOS/Windows text files a line break, also known as newline, is a
       combination of two characters: a Carriage Return (CR) followed by a
       Line Feed (LF). In Unix text files a line break is a single character:
       the Line Feed (LF). In Mac text files, prior to Mac OS X, a line break
       was single Carriage Return (CR) character. Nowadays Mac OS uses Unix
       style (LF) line breaks.

       Besides line breaks Dos2unix can also convert the encoding of files. A
以下省略

あれ? Macのdos2unixのmanって、Linuxのと同じですね。
同じ名前ですし、同じコマンドなんですね。

使ってみましょう。

Linuxでこのようなテキストを作成。

takk~$ cat linux.txt
abcdefg
hijklmn
opqrstu
takk~$

Macでも同じテキストを作成。

takk@makku ~ % cat mac.txt
abcdefg
hijklmn
opqrstu
takk@makku ~ %

次に、同じ内容のテキストをWindowsで作成し、Linuxにもってきます。ファイル名はwin.txtとします。
両者をls表示して比較してみましょう。

takk~$ ls -l *.txt
-rw-r--r-- 1 takk takk 24 Jun  2 21:08 linux.txt
-rw-r--r-- 1 takk takk 24 Jun  2 21:08 mac.txt
-rwxr-xr-x 1 takk takk 27 Jun  2 21:10 win.txt
takk~$

Windowsは改行コードが異なるので、ファイルサイズも違いますね。3行のテキストファイルなので、3BYTE差があります。

odでのダンプでも比較してみましょう。

takk~$ od -tx1a -An linux.txt
  61  62  63  64  65  66  67  0a  68  69  6a  6b  6c  6d  6e  0a
   a   b   c   d   e   f   g  nl   h   i   j   k   l   m   n  nl
  6f  70  71  72  73  74  75  0a
   o   p   q   r   s   t   u  nl
takk~$
takk~$ od -tx1a -An mac.txt
  61  62  63  64  65  66  67  0a  68  69  6a  6b  6c  6d  6e  0a
   a   b   c   d   e   f   g  nl   h   i   j   k   l   m   n  nl
  6f  70  71  72  73  74  75  0a
   o   p   q   r   s   t   u  nl
takk~$
takk~$ od -tx1a -An win.txt
  61  62  63  64  65  66  67  0d  0a  68  69  6a  6b  6c  6d  6e
   a   b   c   d   e   f   g  cr  nl   h   i   j   k   l   m   n
  0d  0a  6f  70  71  72  73  74  75  0d  0a
  cr  nl   o   p   q   r   s   t   u  cr  nl
takk~$

MacとLinuxは完全一致です。

では、dos2unix、使ってみます。
Windowsの改行コードをlinux用に変換します。
dos2unixコマンドは、破壊的置換。つまりファイルをそのまま変換してしまうので、テンポラリファイルを作成し、そちらを変換するようにします。

takk~$ cp win.txt tmp.txt
takk~$ dos2unix tmp.txt
dos2unix: converting file tmp.txt to Unix format...
takk~$ cmp tmp.txt linux.txt
takk~$

変換後のWindowsのテキストが、Linuxのテキストと一致しました。
念のためサイズも見てみます。

takk~$ ls -l *.txt
-rw-r--r-- 1 takk takk 24 Jun  2 21:08 linux.txt
-rw-r--r-- 1 takk takk 24 Jun  2 21:08 mac.txt
-rwxr-xr-x 1 takk takk 24 Jun  2 21:19 tmp.txt
-rwxr-xr-x 1 takk takk 27 Jun  2 21:10 win.txt
takk~$

tmp.txtは、サイズも24で一致してますね。
今度は、LinuxのテキストをWindowsの改行コードに変換します。同じようにtmp.txtを使います。

takk~$ cp linux.txt tmp.txt
takk~$ unix2dos tmp.txt
unix2dos: converting file tmp.txt to DOS format...
takk~$ cmp tmp.txt win.txt
takk~$ ls -l *.txt
-rw-r--r-- 1 takk takk 24 Jun  2 21:08 linux.txt
-rw-r--r-- 1 takk takk 24 Jun  2 21:08 mac.txt
-rwxr-xr-x 1 takk takk 27 Jun  2 21:20 tmp.txt
-rwxr-xr-x 1 takk takk 27 Jun  2 21:10 win.txt
takk~$

こちらも一致しました。

コメント

タイトルとURLをコピーしました