【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結果

内容
1 CR ONLY[CR]
2 LF ONLY[CRLF]
3 CRLF [CRLF]

内容
1 CR ONLY[CR]
2 LF ONLY[LF]
3 CRLF [LF]


補足だが、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になっていることを確認できる。