• 締切済み

【unix】nkfで文字コードを変えずに改行コードを変えたい

unix(BSD)初心者です。 PHP経由でunixを操作、ファイルの加工をしております。 nkfコマンドにてLF改行をCR+LF改行にしたいのですが、 ・文字コードは無変化で改行コードだけ変える などということはできるのでしょうか? いろいろな文字コードのファイルが混在している場合に文字コードはそのまま保ちつつ改行コードはCR+LFに統一したいのです。 お詳しい方よろしくお願いします。

みんなの回答

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.7

そうか。バイナリもあるんですね。バイナリかテキストかは、拡張子で判断できるんですよね? 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)
回答No.6

改行が CRLF と LF のファイルが混在すると言うことですね。 tr -d '\r' <file >outfile で、全ファイルからCRを削除してLFのみに統一し、 zip の時に -l オプションでLF -> CRLFに変換すればいいでしょう。 最初にCRを削除しておかないと、zip -l で CRLF のファイルが CRCRLF になります。

ikataro
質問者

お礼

zip の -l オプション はバイナリファイルにも影響を与えるため使えないんですよ…

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

>このためにバイナリであげてくれとは言えないのです。 逆にバイナリデータもアップロードの対象となっているなら へんにコンバートでlf→crlf変換するとファイルが壊れちゃいますね。 そうじて改行コードについては目をつぶる・・・というのが 賢明かもしれません。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

>FTPでWindowsPCからUNIXサーバーへアップすると、改行が CR+LF → LF に変換される バイナリーモードで転送すれば変換されないと思いますが、 ユーザーに意識させないということでしょうか?

ikataro
質問者

お礼

はいそうです。 アップする人は数十人いて、このためにバイナリであげてくれとは言えないのです。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

#1です。すいません。-t だと改行コードも変換されないんですね。 方法は無さそうです。nkf 以外のツールでやるしかないですね。

ikataro
質問者

お礼

そうですね… -t って何につかうのでしょうか…

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

PHPでなぜunixのコマンドを実行する必要があるかを提示するのが 先でしょう。 今回の件ならPHPだけで十分できそうですよ。 また、文字コードはそのままでCRLFにすると EUCなのにCRLFになって中途半端なファイルになる可能性がありますが そういう方針で間違いないのでしょうか?

ikataro
質問者

お礼

説明不足申し訳ありません。 FTPでアップロードした様々なファイル(バイナリ込み)をZIPにまとめてWeb上でダウンロードするシステムを作っています。 この場合、FTPでWindowsPCからUNIXサーバーへアップすると、改行が CR+LF → LF に変換されるため、ZIP化直前に LF → CR+LF 還元しなければならないと思い今回の質問になりました。 ZIP処理はUNIXとなりますのでついでに改行処理もUNIXでという発想です。 お恥ずかしいことにEUC-JPは必ずLF改行とは知りませんでした…  やはりnkfで文字コードを判定し、場合分けで改行処理… とりあえずそう考えています。 いい方法ありましたらよろしくお願いいたします。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

nkf -t -Lw ですかね。nkf -v でオプションの説明が出ます。

関連するQ&A