にぽたん研修所 兼 にぽたん休憩所

旧にぽたん休憩所をマージしたからわけがわからない

nkf の技

http://kerolin.jspeed.jp/Computer/Linux/vi070323.html

基本的なことなんだろうけどDOSの改行コードをUnixのそれになおすには

:set notextmode

とやればいいらしい。


知らんかった。

「vi の技」ってか、それ多分、vi じゃだめじゃないすかね。

set: no textmode option: 'set all' gives all option values.

vim ならイケる。


でも、改行を変えたい場合は、nkfラクでいい。
ぶっちゃけ、20 世紀に慣れ親しんだ CGI たちのせいで、21 世紀になる頃には古い文化だと思ってて、nkf 嫌ってた。


昔は、色々な CGI にこう書かれてたもん。

$NKF = '/usr/bin/nkf';

そのせいだ。


話逸れた。

use strict;

print "Hello!\x0D\x0A";
print "nkf!\x0D\x0A";
% chmod +x dos.pl
% ./dos.pl > dos.txt
% od -c dos.txt
0000000   H   e   l   l   o   !  \r  \n   n   k   f   !  \r  \n
0000016
% vim dos.txt
Hello!
nkf!
~
~
~
~
~
"dos.txt" [dos] 2L, 14C            1,1      All
% nkf -Lu dos.txt > unix.txt
% od -c unix.txt
0000000   H   e   l   l   o   !  \n   n   k   f   !  \n
0000014
% vim unix.txt
Hello!
nkf!
~
~
~
~
~
"unix.txt" 2L, 12C                 1,1      All

nkf いいよ nkf


改行文字 (Linefeed Character) を、
Windows の改行 (CR+LF) にしたい場合は

% nkf -Lw filename

UNIX の改行 (LF) にしたい場合は

% nkf -Lu filename

Mac の改行 (CR) にしたい場合は

% nkf -Lm filename

とかだから、覚えやすいね。


ちなみに、perlワンライナーとかでやるならこう。

% perl -i.orig -pe's/\x0D\x0A$/\x0A/' dos.txt
% od -c dos.txt
0000000   H   e   l   l   o   !  \n   n   k   f   !  \n
0000014
% od -c dos.txt.orig
0000000   H   e   l   l   o   !  \r  \n   n   k   f   !  \r  \n
0000016

ちゃんと同じことはできる。


引数の覚えやすさでは圧倒的に nkf だけど。
処理速度は…ちょっと検証してみた。


10 万行ぐらいある、巨大な dos.txt を作ってみた。

% ls -l dos.txt
-rw-r--r--  1 nipotan nipotan 50042427 Mar 24 12:27 dos.txt
% wc -l dos.txt
100000 dos.txt
use strict;
use Time::HiRes qw(gettimeofday);

my $nkf_command  = q|nkf -Lu dos.txt > unix.txt|;
my $perl_command = q|perl -i.orig -pe's/\x0D\x0A$/\x0A/' dos.txt|;

my $nkf_start  = gettimeofday();
`$nkf_command`;
my $nkf_end    = gettimeofday();

my $perl_start = gettimeofday();
`$perl_command`;
my $perl_end   = gettimeofday();

printf("nkf: %f seconds\n", $nkf_end - $nkf_start);
printf("perl: %f seconds\n", $perl_end - $perl_start);

結果

nkf: 13.955511 seconds
perl: 4.252004 seconds

perl いいよ perl


一応、同じファイルになってるか検証。

% md5sum unix.txt
8d5e716863d5056899b684fbcb679e18  unix.txt
% md5sum dos.txt
8d5e716863d5056899b684fbcb679e18  dos.txt

うむ。perl 良い。