20002


チームでプログラムしていると時々、ファイルの文字コードや改行コードを乱してしまう人がいます。私のチームでは`ruby on
rails`を使った開発をしていて、ホストサーバーを`CentOS`と定めているため、最初から文字コードを`UTF-8`、改行コードを`LF`のみと定めています。

間違いの大半は`windows`で編集したファイルの改行コードが`CR`+`LF`に変換保存されてしまうことで起きています。それ自体は仕方ないのですが、何度も手で直すのが苦痛になってきました。  
`vi`で直すにはファイルをいちいち開かねばならず（しかも`vi`にそれほど詳しくもなく）、`sed`や`tr`コマンドを使うことも考えましたが、一旦オリジナルのファイルをどこかに退避させないと、元のファイルを上書きできません。

それで、`ed`や`ex`を使うスクリプトを作ればバッチでファイルの直接編集・保存ができるので上手くやれるんじゃないかと思いついた次第です。  
ですが制御文字を`ed`/`ex`で書き換えるサンプルを手早く見つけることができず、もしご存知の方がいらしたら教えていただけるとありがたいです。よろしくお願いします。


CC BY-SA 3.0
2015-12-15T04:45:51.620
20000
2015-12-17T11:12:33.597
2015-12-15T06:50:18.430
9403
9403
question
shellscript
edかexで<CR+LF>を<LF>に変換するバッチ編集は可能でしょうか


edやexである必要はありません。

sed の `-i` オプションを使えば、in-placeで(オリジナルを退避させずに)置き換えができます。  
そのため以下のようなコマンドで、改行コードの変更ができるでしょう。

[code]

    sed -i -e 's/\r$//' [INPUT_FILES]...
    
[/code]

ただしCygwinやMinGWでは設定によっては上手くできない場合があることには注意してください。


CC BY-SA 3.0
2015-12-15T05:00:31.643
20002
2015-12-15T05:00:31.643
208
20000
answer


`nkf -w -d --overwrite`


CC BY-SA 3.0
2015-12-15T05:20:21.733
20004
2015-12-15T05:20:21.733
4603
20000
answer


オイラならソースコード管理ツールで吸収しちゃうかな・・・

[git](/questions/tagged/git "'git' のタグが付いた質問を表示") なら `core.autocrlf`  
[mercurial](/questions/tagged/mercurial "'mercurial' のタグが付いた質問を表示") ならエクステンション
`eol`


CC BY-SA 3.0
2015-12-15T06:05:26.157
20008
2015-12-15T06:05:26.157
8589
20000
answer


別ファイルは作りたくないのかもしれませんが、下の別ファイルを作ってmvするというのは良くやる手です。

[code]

    for F in *; do tr -d \\r < $F > $F+ && mv $F+ $F; done
    
[/code]


CC BY-SA 3.0
2015-12-15T06:18:15.983
20011
2015-12-15T06:18:15.983
7837
20000
answer


dos2unix コマンド使いましょう。引数にファイルを渡せばファイルに直接上書きします。`-k`オプションでタイムスタンプも維持します。

[code]

    $ dos2unix -k file.txt
    
[/code]

カレントディレクトリ以下のファイルを修正する場合はfindからxargsに繋げばOKです。

[code]

    $ find . -type f -print0 | xargs -0 dos2unix -k
    
[/code]

sed 等のストリームエディタを直接使うのはおすすめしません。バイナリファイルを壊してしまいます。  
windowsユーザの過ちが改行コードだけなら(文字コードはきちんとBOM無しUTF-8で保存しているなら)、dos2unixでほとんど事足ります。


CC BY-SA 3.0
2015-12-17T11:12:33.597
20115
2015-12-17T11:12:33.597
62
20000
answer