😸
sedの-zオプション
sedは行志向のテキスト処理ツールですが、GNU sedは-zをつけることによって行志向から、全体を一つの文字列として処理できます。これを使うと改行を別の文字列に変換したり、パイプのテキストに任意の文字列を追加したり、行頭に文字列を追加したりできます。
$ echo -e 'aaa¥nbbb¥nccc' | sed -z 's/¥n/ /g'
aaa bbb ccc $
改行をスペースに変換しました。perlやrubyでいうjoinですね。
最後の改行はスペースに変換したくないので次は、パイプのデータの最後のテキストを変換しましょう。
$ echo -e 'aaa¥nbbb¥nccc' | sed -z 's/¥n/ /g' | sed -z 's/ $/¥n/'
aaa bbb ccc
これでjoinっぽくできました。
-zオプションをつけてs/$/.../とs/^/.../による行頭と行末の変換は本当に便利でパイプ上のデータの先頭や最後に任意の文字列を追加できます。
$ echo aaa | sed -z 's/$/ZZZ¥n'
aaa
ZZZ
行末にZZZを追加しました。
正直sedは行志向であるべきだったのか考えてしましますが
$ echo -e 'aaa¥naaa¥nccc' | sed '1,2/s/aaa/AAA/'
AAA
AAA
ccc
$ echo -e 'aaa¥naaa¥nccc' | sed '2/s/aaa/AAA/'
aaa
AAA
ccc
などと指定行の変換できるので行志向である必要がありますね。
-zと組み合わせれば自由自在にテキスト変換ができると思います。perlとrubyもいいですが
sedも使ってあげましょう。ただし、-zはGNU sedにしかありません。MacなどではGNU sedをインストールしましょう。
Discussion