カテゴリー別アーカイブ: vim

改行を置換したい

改行を置換したいときのメモだよ。
改行コード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