- 締切済み
【unix】nkfで文字コードを変えずに改行コードを変えたい
unix(BSD)初心者です。 PHP経由でunixを操作、ファイルの加工をしております。 nkfコマンドにてLF改行をCR+LF改行にしたいのですが、 ・文字コードは無変化で改行コードだけ変える などということはできるのでしょうか? いろいろな文字コードのファイルが混在している場合に文字コードはそのまま保ちつつ改行コードはCR+LFに統一したいのです。 お詳しい方よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- notnot
- ベストアンサー率47% (4900/10358)
そうか。バイナリもあるんですね。バイナリかテキストかは、拡張子で判断できるんですよね? for f in *.txt do tr -d '\r' < $f >tmp.txt awk '{print $0 "\r"}' tmp.txt > $f done のように一度LFだけにして、CRを追加してCRLFにする。awkじゃなくてsedでも出来ますが、\r のような記法が使えないので、説明が面倒。
- notnot
- ベストアンサー率47% (4900/10358)
改行が CRLF と LF のファイルが混在すると言うことですね。 tr -d '\r' <file >outfile で、全ファイルからCRを削除してLFのみに統一し、 zip の時に -l オプションでLF -> CRLFに変換すればいいでしょう。 最初にCRを削除しておかないと、zip -l で CRLF のファイルが CRCRLF になります。
- yambejp
- ベストアンサー率51% (3827/7415)
>このためにバイナリであげてくれとは言えないのです。 逆にバイナリデータもアップロードの対象となっているなら へんにコンバートでlf→crlf変換するとファイルが壊れちゃいますね。 そうじて改行コードについては目をつぶる・・・というのが 賢明かもしれません。
- yambejp
- ベストアンサー率51% (3827/7415)
>FTPでWindowsPCからUNIXサーバーへアップすると、改行が CR+LF → LF に変換される バイナリーモードで転送すれば変換されないと思いますが、 ユーザーに意識させないということでしょうか?
お礼
はいそうです。 アップする人は数十人いて、このためにバイナリであげてくれとは言えないのです。
- notnot
- ベストアンサー率47% (4900/10358)
#1です。すいません。-t だと改行コードも変換されないんですね。 方法は無さそうです。nkf 以外のツールでやるしかないですね。
お礼
そうですね… -t って何につかうのでしょうか…
- yambejp
- ベストアンサー率51% (3827/7415)
PHPでなぜunixのコマンドを実行する必要があるかを提示するのが 先でしょう。 今回の件ならPHPだけで十分できそうですよ。 また、文字コードはそのままでCRLFにすると EUCなのにCRLFになって中途半端なファイルになる可能性がありますが そういう方針で間違いないのでしょうか?
お礼
説明不足申し訳ありません。 FTPでアップロードした様々なファイル(バイナリ込み)をZIPにまとめてWeb上でダウンロードするシステムを作っています。 この場合、FTPでWindowsPCからUNIXサーバーへアップすると、改行が CR+LF → LF に変換されるため、ZIP化直前に LF → CR+LF 還元しなければならないと思い今回の質問になりました。 ZIP処理はUNIXとなりますのでついでに改行処理もUNIXでという発想です。 お恥ずかしいことにEUC-JPは必ずLF改行とは知りませんでした… やはりnkfで文字コードを判定し、場合分けで改行処理… とりあえずそう考えています。 いい方法ありましたらよろしくお願いいたします。
- notnot
- ベストアンサー率47% (4900/10358)
nkf -t -Lw ですかね。nkf -v でオプションの説明が出ます。
お礼
zip の -l オプション はバイナリファイルにも影響を与えるため使えないんですよ…