【UNIX】unix2dos、dos2unixコマンド
UNIX系OSにはunix2dosと、その逆のdos2unixコマンドというのが存在する。
使い方(オプション)はほとんど同じだが効果(?)が違う。
主に改行コードを変換する目的で使用する。
先に述べたiconvコマンドと併用することで、UNIX系OS上でWindows系OS向けのテキストファイルを用意することが出来る。
■コマンド概説
unix2dosは、改行コードをUNIX標準のLFからWindows標準のCR+LFへ、
dos2unixは、改行コードをWindows標準のCR+LFからUNIX標準のLFへ、
それぞれ変換するために使用する。
■基本的な使い方
unix2dosも、dos2unixも、基本的なコマンド実行方法は以下の通りとなる。
unix2dos [input-file]
dos2unix [input-file]
■-nオプション
↑の「基本的な使い方」の例だと、[input-file]をそのまま変換かけてしまう(コマンド実行前のファイルは残らない)ので、
元のファイルを残したいなら-nオプションを使って以下のように実行する必要がある。
unix2dos -n [input-file] [output-file]
■-qオプション
通常だと、実行時に以下のような標準出力が出る↓
unix2dos: converting file test.txt to file test_out.txt in DOS format ...
これが鬱陶しい場合-qオプションを付けると防止できる。
unix2dos -q -n [input-file] [output-file]
■CR、LFが混在している場合
原則的に「コマンド概説」に書いた通りの動きをするので、
unix2dosはLFしか変換の対象にしないし、
dos2unixはCRLFしか変換の対象にしない。
よってたとえば以下のようなテキストファイルが存在した場合
行 | 内容 |
---|---|
1 | CR ONLY[CR] |
2 | LF ONLY[LF] |
3 | CRLF [CRLF] |
※[CR]とか[LF]はそこにその改行コードがあることを便宜的に書いているだけであり、
そういう文字列があるわけではない(わかると思うけど)
それぞれのコマンドの実行結果は以下の通りとなる。
unix2dos結果 | dos2unix結果 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
補足だが、javaで↑のようなCRLF混在のテキストファイルを作成するソースコードを載せる。
import java.io.*;public class CRLFMixTextFileMakeForTest {
private static final File TEST_FILE = new File("CRLF_MIX.txt"); private static final byte[] CR_BYTE = new byte[] {13}; private static final byte[] LF_BYTE = new byte[] {10}; private static final byte[] CRLF_BYTE = new byte[] {13,10}; public static void main(String[] args) { try { makeFile(); } catch(Throwable e) { e.printStackTrace(); } } private static void makeFile() throws Throwable { BufferedWriter bw = null; try { bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(TEST_FILE))); bw.write("CR ONLY"); bw.write(new String(CR_BYTE)); bw.write("LF ONLY"); bw.write(new String(LF_BYTE)); bw.write("CRLF "); bw.write(new String(CRLF_BYTE)); bw.flush(); } catch(Throwable e) { e.printStackTrace(); } finally { if (bw != null) { bw.close(); } } }
}
■iconvと併用した使い方
UNIX系OSで用意したUTF-8、LFのテキストファイル「test.txt」を、
Windows系OS向けのSJIS、CRLFに変換して「test_conv.txt」にする場合のコマンド例。
iconv -f UTF-8 -t MS932 | unix2dos > test_conv.txt
iconvは-oとか指定がなければ結果を標準出力してくれるので、
それをパイプで繋いでunix2dosに引き渡す。
unix2dosに結果を標準出力するようなオプションがあったかな?あれば別に順番逆でもいいと思う。
このコマンドをUNIX系OS(標準的にUTF-8とLFが採用される環境)上で実行すると、
リダイレクト直前の内容(SJISとCRLFによる標準出力)は一見文字化けているように見えるが、
最終的に出力される「test_conv.txt」をWindows系OSで開くとちゃんとSJIS、CRLFになっていることを確認できる。