読者です 読者をやめる 読者になる 読者になる

A Perfect Night For Bananafish

だがそれを語るには人生は短すぎる

改行コードCR+LFのファイルからCRを取り除く

Technotes

地味だけどたまに使うので。改行コードにまつわる話はここでは割愛。
crlf2lf.rb

while s=gets
	$stdout.binmode.write(s.gsub(/\r\n$/,'\n'))
end

ポイントはbinmode(バイナリモード)。

CRを取り除いたファイルを作成するには

ruby crlf2lf.rb file1.txt > file2.txt

とすればよい。


本当に改行コードを変換できたの?

確認用スクリプト。ファイルをバイナリモードでオープン。
checkrc.rb

while filename = ARGV.shift
	open(filename,"rb") { |file|
		puts filename
		while s=file.gets
			p s
		end
	}
end

実行結果

ruby crlf2lf.rb file1.txt > file2.txt                 #CR+LF->LF
ruby checkrc.rb file1.txt file2.txt      #確認
file1.txt
"ABCDEFG\r\n"
"HIJKLMN\r\n"
"OPQRSTU\r\n"
"VWXYZ!?\r\n"
file2.txt
"ABCDEFG\n"
"HIJKLMN\n"
"OPQRSTU\n"
"VWXYZ!?\n"

file2.txtでは、CRの\rが取り除かれていることがわかる。


ワンライナーで・・・

上の改行コード変換スクリプトcrlf2lf.rbはwhile gets ... endで処理しているので、rubyコマンドライン・オプション-e,-nを使って、ワンライナー(1行プログラム)で書き換えることができる。

-e 'command' one line of script. Several -e's allowed. Omit [programfile]
-n assume 'while gets(); ... end' loop around your script
ruby -n -e '$stdout.binmode.write(gsub(/\r\n$/,"\n"))' file1.txt > file2.txt

※オプション -n -e は、-ne と書いてもよい。

まあ実は

ruby -pe 'gsub(/\r\n/,"\n")' file1.txt > file2.txt

でいいんだけどね。