Skip to content

改行コードを調べる newline_code.pl

by wetcradle on 6月 4th, 2011

ファイルの改行コードを確認しなければいけないことが結構あります。

od や xxd で調べてもいいのですが、面倒臭いし、混在しているかどうかが分かりません。また、nkf –guess を使ってもいいのですが、バージョンによっては出力されないみたいです。

ということで、簡単なスクリプトですが、地味に便利かなと思って作りました。

使い方

$ ./newline_code.pl test/*txt
test/cr.txt	CR
test/crlf.txt	CRLF
test/empty.txt	UNKNOWN
test/lf.txt	LF
test/mix.txt	MIXED NL

ソースコード

#!/usr/bin/perl

use strict;
use warnings;
use File::Basename;

########## config ##########

my $SCRIPT = basename($0);

my $CR = "CR";
my $LF = "LF";
my $CRLF = "CRLF";
my $MIXED_NL = "MIXED NL";
my $UNKNOWN = "UNKNOWN";

########## usage ##########
sub usage() {
	print STDERR <<EOF;
Usage: $SCRIPT &#91; file ... &#93;
       $SCRIPT < file

標準入力または複数ファイルの改行コードを調べます。
EOF
}

########## main ##########
if ($#ARGV == -1) {
	print &check_newline_code(*STDIN) . "\n";
}
else {
	foreach my $file (@ARGV) {
		open(FILE, "<$file") || die "open failed: $file: $!";
		print "$file\t" . &check_newline_code(*FILE) . "\n";
		close(FILE);
	}
}

########## check_newline_code ##########
sub check_newline_code($) {
	my ($input) = @_;
	my $lf_flag = 0;
	my $cr_flag = 0;
	my $crlf_flag = 0;
	my $previous_cr_flag = 0;
	while (!eof($input) && $lf_flag + $cr_flag + $crlf_flag <= 1) {
		my $byte = getc($input);
		if ($byte eq "\r") {
			if ($previous_cr_flag) {
				$cr_flag = 1;
			}
			$previous_cr_flag = 1;
		}
		elsif ($byte eq "\n") {
			if ($previous_cr_flag) {
				$crlf_flag = 1;
				$previous_cr_flag = 0;
			}
			else {
				$lf_flag = 1;
			}
		}
		else {
			if ($previous_cr_flag) {
				$cr_flag = 1;
				$previous_cr_flag = 0;
			}
		}
	}
	$cr_flag = 1 if ($previous_cr_flag);
	
	my $sum = $lf_flag + $cr_flag + $crlf_flag;
	if ($sum == 0) {
		return $UNKNOWN;
	}
	elsif ($sum > 1) {
		return $MIXED_NL;
	}
	elsif ($cr_flag) {
		return $CR;
	}
	elsif ($lf_flag) {
		return $LF;
	}
	elsif ($crlf_flag) {
		return $CRLF;
	}
}

From → perl

No comments yet

Leave a Reply

Note: XHTML is allowed. Your email address will never be published.

Subscribe to this comment feed via RSS