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
改行文字 (Linefeed Character) を、
Windows の改行 (CR+LF) にしたい場合は
% nkf -Lw filename
UNIX の改行 (LF) にしたい場合は
% nkf -Lu filename
旧 Mac の改行 (CR) にしたい場合は
% nkf -Lm filename
とかだから、覚えやすいね。
% 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
一応、同じファイルになってるか検証。
% md5sum unix.txt 8d5e716863d5056899b684fbcb679e18 unix.txt % md5sum dos.txt 8d5e716863d5056899b684fbcb679e18 dos.txt
うむ。perl 良い。