Aug 182012
 

テキストファイルにCRLFが含まれるか1行コマンドで調べようと思ったら、単純なfileコマンドではShell Script等のときはBourne-Again shell scriptと判定されてしまいCRLFまでは確認できません。

$ file test.sh
test.sh: Bourne-Again shell script text executable

でも実行するとShebangにCRが含まれているのでエラーになるのです。

$ ./test.sh
-bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory

単純なテキストファイルであれば、以下のようにCRLF含まれるテキストファイルだと報告してくれます。

$ file test.txt
test.txt: ASCII text, with CRLF line terminators

バージョン5以降のfileコマンドであればShebang判定をしないようにmagicファイルに/dev/nullを指定することができるのですが、CentOS 5系列はfileコマンドバージョン4なので使えません。

$ file -m /dev/null test.sh
test.sh: ASCII text, with CRLF line terminators

CentOS 5でも6でも使えそうな、もう少し汎用的な方法がないか調べると、海外ではいろいろと情報が見つかります。

ほとんどgrepですけど。

  1. ‘^M’をgrepする方法。^MはCtrl-V Ctrl-Mで入力します。
    grep '^M'
  2. \r\nをgrepする方法。
    grep `printf '\r\n'`

    Bash shellの場合はprintfを使わず、$’\r’で置き換えることもできるようです。

    grep $'\r'

    ※ほんとは$’\r’$’\n’で検索したいところですが、それだとLF onlyの行末にもマッチしてしまうようなのでとりあえずCRだけ検索する指定にしています。理由はよくわかっていません。

  3. grepでPerl Regexpを使う方法もあります。
    grep -P '\r\n'

    でもCentOS 6では使えなくなったようです。

    -P, --perl-regexp
                  Interpret PATTERN as a Perl regular expression.  This is highly experimental and grep -P may warn of unimplemented features.
    

個人的にはfile -m /dev/nullか、より汎用性を求めるならgrep `printf ‘\r\n’`かと思いました。

 Posted by at 1:52 am  Tagged with:

Sorry, the comment form is closed at this time.