プロが教えるわが家の防犯対策術!

unix(BSD)初心者です。
PHP経由でunixを操作、ファイルの加工をしております。
nkfコマンドにてLF改行をCR+LF改行にしたいのですが、

・文字コードは無変化で改行コードだけ変える

などということはできるのでしょうか?

いろいろな文字コードのファイルが混在している場合に文字コードはそのまま保ちつつ改行コードはCR+LFに統一したいのです。

お詳しい方よろしくお願いします。

A 回答 (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 のような記法が使えないので、説明が面倒。
    • good
    • 0

改行が CRLF と LF のファイルが混在すると言うことですね。


tr -d '\r' <file >outfile で、全ファイルからCRを削除してLFのみに統一し、
zip の時に -l オプションでLF -> CRLFに変換すればいいでしょう。

最初にCRを削除しておかないと、zip -l で CRLF のファイルが CRCRLF になります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/12/04 09:45

>このためにバイナリであげてくれとは言えないのです。



逆にバイナリデータもアップロードの対象となっているなら
へんにコンバートでlf→crlf変換するとファイルが壊れちゃいますね。

そうじて改行コードについては目をつぶる・・・というのが
賢明かもしれません。
    • good
    • 0

>FTPでWindowsPCからUNIXサーバーへアップすると、改行が CR+LF → LF に変換される



バイナリーモードで転送すれば変換されないと思いますが、
ユーザーに意識させないということでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/12/02 10:00

#1です。

すいません。-t だと改行コードも変換されないんですね。
方法は無さそうです。nkf 以外のツールでやるしかないですね。
    • good
    • 0
この回答へのお礼

そうですね…

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

お礼日時:2009/12/02 01:23

PHPでなぜunixのコマンドを実行する必要があるかを提示するのが


先でしょう。
今回の件ならPHPだけで十分できそうですよ。

また、文字コードはそのままでCRLFにすると
EUCなのにCRLFになって中途半端なファイルになる可能性がありますが
そういう方針で間違いないのでしょうか?
    • good
    • 0
この回答へのお礼

説明不足申し訳ありません。

FTPでアップロードした様々なファイル(バイナリ込み)をZIPにまとめてWeb上でダウンロードするシステムを作っています。
この場合、FTPでWindowsPCからUNIXサーバーへアップすると、改行が CR+LF → LF に変換されるため、ZIP化直前に
LF → CR+LF 還元しなければならないと思い今回の質問になりました。
ZIP処理はUNIXとなりますのでついでに改行処理もUNIXでという発想です。

お恥ずかしいことにEUC-JPは必ずLF改行とは知りませんでした… 

やはりnkfで文字コードを判定し、場合分けで改行処理… とりあえずそう考えています。

いい方法ありましたらよろしくお願いいたします。

お礼日時:2009/12/02 01:21

nkf -t -Lw


ですかね。nkf -v でオプションの説明が出ます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!