末尾スペースを一括削除する
まずechoコマンドで末尾スペースのあるファイルを作成します。
echo -e "hello hello \nworld " > test.txt
次にそのファイルに対してsedで正規表現を利用して一括置換を行います。
sed -i 's/\s+$//g' test.txt
これでもよさそうです。
sed -ie 's/\s+$//' test.txt
\s は エスケープされたスペースを指し、+ は直前のパターンの1回以上の繰り返しを指し、$ は末尾を指します。
つまり、正規表現で「すべての行の末尾にある複数スペース」がマッチすることになります。
余談ですが、以下の改行コードを標準出力に表示させるコマンドで、ファイルの中身のスペースが削除されたか確認できます。
cat -E test.txt
さらに余談ですが、vimでファイルを保存するときに自動で末尾スペースを削除する.vimrc設定は以下です。
" 行末のスペースを自動削除 autocmd BufWritePre * :%s/\s\+$//
現在のディレクトリ直下のファイルを対象に、末尾スペースを一括削除する
前述の応用版です。
上記だと微妙に要求を満たせなくてググりまくってつらかったです。
まずはapp/以下のファイルだけ適用します。
grep -Elr '\s+$' app/ | xargs sed -ri "s/\s+$//g"
捕捉ですが、sedのオプションを-irと逆にやるとファイルの末尾にrがついてえらいこっちゃになります。ダメゼッタイ!!!
ディレクトリ指定せずに誤ってドットファイルをいじってしまうと、gitコマンドすら使えなくなるため、ディレクトリ指定した方が無難だと思います。
除外したい対象のファイルを指定するときは以下のようにします。
(たぶんもっといいやり方あると思います)
grep -Elr '\s+$' . | grep -v ".git" | xargs sed -ri "s/\s+$//g"
最終的にはこんな感じになりました。
grep -Elr '\s+$' --include=*.rb | xargs sed -ri "s/\s+$//g"
rbファイルに絞って、末尾がスペースの行すべてを対象として、複数スペースを一括削除するというワンライナーになります。
ちなみにgit diffして、スペースの差分を確認するには以下を設定します。
git config --global diff.wsErrorHighlight all