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ですけど。
- ‘^M’をgrepする方法。^MはCtrl-V Ctrl-Mで入力します。
grep '^M'
- \r\nをgrepする方法。
grep `printf '\r\n'`
Bash shellの場合はprintfを使わず、$’\r’で置き換えることもできるようです。
grep $'\r'
※ほんとは$’\r’$’\n’で検索したいところですが、それだとLF onlyの行末にもマッチしてしまうようなのでとりあえずCRだけ検索する指定にしています。理由はよくわかっていません。
- 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’`かと思いました。
Sorry, the comment form is closed at this time.