それマグで!

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

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

sed で改行削除/sedで全文(複数行マッチ)

sed で改行を消してCSVにしたい。

コマンドの結果の改行を消してCSVのようなカンマ区切りに変換したい。

他の置換ツールや python / rubyワンライナーに回せばいいと思うけど、sedでできたほうが汎用性が高そう。そのためsedで改行を置換、改行を別の文字に変えてCSVのような文字区切りをやってみる。

sed は行ごとの処理

sed は、「行ごと」で処理するのが基本動作なので、改行にマッチとか、改行を削除することはできない。

grep でもそうなんだけど、行処理が暗黙の前提なものを全体マッチにするときは、ちょっとオプションを見てあげると解決。

全体にマッチする。

マッチする箇所を「全体」に設定してあげるといい。

networksetup  -listallnetworkservices | \grep -v as | sed -z 's/\n/,/g'

-z オプション

-z オプションを使って、複数行に亘るマッチングができる。z は「全文・全体」と覚えれば絶対に忘れない。

bsd sed / gnu sed

macos で試したが、 -z があるのは GNU sed のみ。

macos などのBSDななsedでは、次のように。

sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g'

macの場合は、brewgnu sed ( gsed ) をインストールしてもいいですね。

参考資料

https://orebibou.com/ja/home/201607/20160714_003/