😸

sedの-zオプション

2021/12/26に公開

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