改行を置換したいときのメモだよ。
改行コードCR+LFからCRを取り除くとかいう話ではなくて、改行そのものを置換したいときのメモ。CRは入ってない前提。
コマンドのバージョンとか動作環境によってはうまく動かないこともあるかもしれない。
【例】改行をカンマ’,'に置換する
A B C
というファイルを
A,B,C
のように書き換えたいという例でお話しする。
エディタで
Emacs
M-x replace-string Replace string:
のところでC-q C-jと入力すると改行コードを引用できて、コマンド行が改行される。Enterで決定すると
Replace string with ^J with:,
となる。改行は^Jで表されている。置換先のカンマ’,'を入力してEnterで決定すれば、現在行以下の改行がすべてカンマに置換される。
Vim
:%s/\n//g
コロンを押してコマンドモードにして%でファイル全体を指定。
%の代わりに1,$と書いてもよい。1行目から最後の行までという意味。
もし置換ではなく改行削除して行を連結するだけなら、J(Shift+j)を押しっぱなしってのもひとつの手。
コマンドラインで
エディタを開かずにコマンドラインだけで済ませたいときもある。
filename は改行を含むテキストファイル。
標準出力に表示するだけなので、必要があれば > newfilename とかやって新しいファイル名を指定して出力してね。
元と同じファイル名に吐き出して消しちゃうっていうのはやりがちなミスなので気をつけて。
tr
以上は代表的なエディタ上での置換方法だったけど、コマンドラインで済ませたいときはtrがいちばんラクかも。
tr '\n' ',' < filename あるいは tr '\012' ',' < filename
改行を削除したいときはーdオプション。
tr -d '\n' < filename あるいは tr -d '\012' < filename
awk
awk -F\n -v ORS=',' '{print}' filename
-Fで区切り文字指定、 -v ORSで出力の区切り文字指定。
sed
sedは1行ごとに処理するのは得意なんだけど、改行をまたぐ処理はわりと面倒くさい。
たとえば上の例とは逆にカンマを改行に変えるのであれば
sed 's/,/\n/g' filename あるいは sed 's/,/\ ←バックスラッシュの後で普通にEnterを押す > /g' filename
でうまくいく。1行目のバックスラッシュのあとに普通に改行ボタン押せば次の行にプロンプトが出るので、続きを入力すればよい。
ところが例題の処理をやろうとして
sed 's/\n/,/g' filename あるいは sed 's/\ > /,/g' filename
と書いてもうまくいかないワケ。
じゃあどうするかというと、Nコマンドというのを使えば次の行も読み込めるので、これを最後までループでまわして全体を読み込んでから置換する。
sed ':loop; N; $!b loop; ;s/\n/,/g' filename あるいは sed ':loop; N; $!b loop; ;s/\ > /,/g' filename
ただGNUのsedだとうまくいくけど、BSDのsedだとこのやり方でもうまくいかないかも。
[参考]sed の使い方 4.3 改行をすべて削除
Perl
perl -pe 's/\n/,/g' filename
ruby
ruby -pe 'gsub(/\n/,",")' filename