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(正規表現)
takuya@:~$ sudo atq | sed -r 's/\s+/,/g'
sed -r
で正規表現が使えるので、正規表現を使ったほうが置換に慣れた人は使いやすいと思う。エスケープ・シーケンスをシェル展開で利用しなくても良い。正規表現で文字種を指定したほうが確実。
覚えておくと世界が広いのが、awk とrubyワンライナー
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
について追記