rm /blog

IT系技術職のおっさんがIT技術とかライブとか日常とか雑多に語るブログです。* 本ブログに書かれている内容は個人の意見・感想であり、特定の組織に属するものではありません。/All opinions are my own.*

【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になっていることを確認できる。