#!/bin/sh # $ checkn file_name... # Check line feed code for fname in $@ do echo '--------------------' echo "${fname} uses" echo "" sed -n '1p' <"$fname" | perl -pe 's/^[^\r\n]*//msg' | od -c | perl -pe 's/^\d+//msg' echo 'for line feed code' echo '--------------------' done
$ checkn file… というコマンドで指定したファイルの改行コードを表示するシェルスクリプトです。
以下、中身を解説します。
for fname in $@
for文で引数に取ったファイルの配列($@)から1つずつファイルを読み込んでいます。
sed -n '1p' <"$fname" | perl -pe 's/^[^\r\n]*//msg' | od -c | perl -pe 's/^\d+//msg'
上記の部分がシェルスクリプトの肝ですが、まず、
sed -n '1p' <"$fname"
で、渡されたファイルから最初の1行をバッファに読み込んで、パイプした次のコマンドに渡しています。
perl -pe 's/^[^\r\n]*//msg'
ワンライナーの Perlスクリプトで渡された文字列の改行コード以外を削除(空文字に置換)しています。
正規表現部分にコメントを付けると以下のようになります。
s/ #パターンマッチして置換するためのs ^ #行の先頭アサーション [^\r\n]* #文字クラスで改行コード(\r または \n)以外(^)を指定 //msgx #空文字に置換。gフラグでマッチするパターンを全て置換 #xフラグはコメントを書くために使用
また、スイッチを -pe とする事によって置換した結果の文字列を次のコマンドに渡しています。
od -c
odコマンドに -cスイッチを指定して、受け取った文字列の改行コードを \r または \n で表示するようにしています。
perl -pe 's/^\d+//msg'
最後の置換作業は、単に odコマンドで出力される改行コード以外の部分を削除するために置いています。
このシェルスクリプトに checkn という名前を付けてカレントディレクトリに保存したとします(名前はなんでも良い)。
なお、このままでは新しいコマンドとして実行権限がないので chmodコマンドで実行権限を与えてやります。
$ chmod a+x checkn
すると下記のように任意のファイルの改行コードを表示してくれるコマンドの出来上がりです。
$ ./checkn file_name -------------------- file_name uses \r \n for line feed code --------------------
更に、このシェルスクリプトをどの場所からも(また全てのユーザから)実行可能にするためには /usr/local/bin というフォルダにスクリプトファイルを移してやればOKです。
$ sudo cp checkn /usr/local/bin/checkn
僕の環境(Mac OS X Mountain Lion)だと、ただの cpコマンドじゃ権限がないよと言われてしまったので sudo で実行しました(パスワードの入力を求められます)。
/usr/local/bin にシェルスクリプトを放り込めれば先程の例で頭に付けていた ./ は不要となり、カレントディレクトリがどこであってもそのユーザなら実行できるようになります。
$ checkn file_name