それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

コマンドでtabやスペースを置換する方法

TABを置換してCSVを作りたいとしよう。TAB置換には何を使いますか?

sed/awk/tr/perl/ruby

色々と考えられる。

一番楽なのは tr

 tr '\t' ',' 

tr コマンドで文字を置換するのが多分楽

takuya@atom:~$ sudo atq | tr '\t' ',' 
806,Wed Aug  6 19:47:00 2014 a www-data
848,Sun Aug 10 10:57:00 2014 a www-data
793,Tue Aug  5 16:57:00 2014 a www-data
821,Fri Aug  8 00:47:00 2014 a www-data
835,Sun Aug 10 03:27:00 2014 a www-data

sed でやる場合1

sed s/"\t"/,/g

\tを文字として囲う必要がある。 ただしTABもスペースも全部置換したいなら \s が使える分、sed有利

takuya@atom:~$ sudo atq | sed s/"\s"/,/g | tail
806,Wed,Aug,,6,19:47:00,2014,a,www-data
848,Sun,Aug,10,10:57:00,2014,a,www-data
793,Tue,Aug,,5,16:57:00,2014,a,www-data
821,Fri,Aug,,8,00:47:00,2014,a,www-data
835,Sun,Aug,10,03:27:00,2014,a,www-data

sed でやる場合2(正規表現

sed を使うなら、正規表現を有効にしたほうが確実だろう。

takuya@:~$ sudo atq  | sed -r 's/\s+/,/g'

sed -r正規表現が使えるので、正規表現を使ったほうが置換に慣れた人は使いやすいと思う。エスケープ・シーケンスをシェル展開で利用しなくても良い。正規表現で文字種を指定したほうが確実。

覚えておくと世界が広いのが、awkrubyワンライナー

awk '{sub(/\t/,","); print $0 }'

awk も便利ですね。

ruby でやる場合

ruby -F'\t' -aple '$_=$F.join(",")'

これは、\sも対象にするならもっと楽にかけて

ruby  -aple '$_=$F.join(",")'

と書ける。

ruby ワンライナーを覚えておくとワンライナーが一番応用出来るんじゃないかな。

2019-05-16

カテゴリ整理

2022-01-23

sed -r について追記

参考資料

http://popoon.hatenablog.com/entry/2014/01/27/233751