はじめに
以前、OSを跨ぐ作業により異なる改行コードが混在してスクリプトが実行出来なかったという事がありました。
https://momozo.tech/2019/11/23/fac%e6%94%b9%e8%a1%8c%e3%82%b3%e3%83%bc%e3%83%89/
異なるエディタを使っていたり、変態的なキーマッピング設定を行っているなど、理由は様々ですが意図しない文字コードがソースコードに入り込む現象は意外と多いです。(他には.editorconfig
を作っていないとかも考えられますかね。)
その結果プログラムが動かず、あげくデバックに何時間も要したなんて悲しい過去が、エンジニアならば心当たりがきっとあるはずです。そこで今回はVimで制御文字を調査してsedで簡単に除去する方法をまとめたいと思います。
Vimによる制御文字の調査
まずはVimで制御文字を調べる方法です。制御文字の一覧はWikipediaが簡潔でリファレンスに丁度いいです。
Vimにおける制御文字の入力方法は挿入モードで<Ctrl + v>
の後にCtrl + 制御文字
で入力出来ます。例えば<Ctrl + v>
の後に<Ctrl + m>
とすればCRという制御文字が入力されます。これはOS跨ぎの作業で苦しめられた制御文字でした。
ここからが本題ですが、制御文字にカーソルを合わせてノーマルモードからga
と入力します。するとVimメッセージに下記の様に表示されるかと思います。
<^M> 13, Hex 0d, Oct 015, Digr CR
これをWikipediaの制御文字一覧と照らし合わせてみると、確かにWindowsや古いMac OSで使われていた改行や行送りに当たるCarriage Returnの制御文字であることが分かります。
この方法を用いればどんな制御文字が混入していたとしても直ぐにそれが何なのか把握することが可能です。またVimメッセージの「Hex」に続く16進数としての数値コードをこの後置換する際に使用するので控えておいて下さい。
sedで制御文字を置換
続いて不要な制御文字を削除します。今回は先程調べたCarriage Return(Vimだと「^M」)を置換削除します。下記のコマンドを実行して下さい。
$ sed -i -e $'s/\x0d//' [該当ファイル]
「^M」の16進数での数値コードを置換しております。今更ですが文字にはそれぞれ数値コードが存在しており「0d」はCarriage Return以外には存在しないので、これで狙った制御文字のみを取り除く事が可能なのです。
grepで制御文字を検索
あとはgrepコマンドで再帰的に制御文字の検索が出来るとより良いと思います。
$ grep $'\x0d' -lr [該当ディレクトリパス]/*
所見だと焦りますが方法を知っていれば簡単ですよね。Linterによっては警告してくれるのですが、気づけない場合もあるので方法をまとめてみました。