LoginSignup
54
47

sed による置換で改行\nを出力する

Last updated at Posted at 2016-03-22

こんにちは。
sed による置換で改行\nを出力する方法を調べました。

  • \n をコマンド引数内へ指定する方法がそれほど率直ではないです。
  • なお perl ではより率直に実現できます(下記)。

GNU sed

GNU sed では下記のようにすれば良いです(クォーテーションマークの書き方には変種があります)。

$ echo "aa\nbb\ncc" | gsed "s/\\\\n/\n/g"
$ echo "aa\nbb\ncc" | gsed -r 's/\\n/\n/g'
aa
bb
cc

一般の sed

一般の sed で動かすためには一手間必要でした。ただし、\n を同様に直接書き入れるために、bash の助けを借りています。

$ echo "aa\nbb\ncc" | sed s/\\\\n/\\$'\n'/g
$ echo "aa\nbb\ncc" | sed s/'\\n/\'$'\n'/g
$ echo "aa\nbb\ncc" | sed 's/\\n/\'$'\n/g'
aa
bb
cc

この方法は何度も話題になっているようで、下記で見つけました。

bash の助けを借りない方法

下記は bash の助けを借りない方法による例です。なお上記も参考になりました。

$ echo "aa\nbb\ncc" | sed 's/\\n/\
/g'
aa
bb
cc

もしくは、改行を表す文字列変数を一旦作り1、それを用いる方法もあります。

$ LF=$(printf '\n_');LF=${LF%_}
$ echo "aa\nbb\ncc" | sed 's/\\n/'"$LF"'/g'

perl コマンド

なお perl を使えばより率直に実現できます2 3

$ echo "aa\nbb\ncc" | perl -pe 's/\\n/\n/g'
aa
bb
cc

tr コマンド

さらに置換対象が一文字ならば、tr が最も簡素と思います。

$ echo "aa:bb:cc" | tr ':' '\n'
aa
bb
cc
  1. シェルの文字列変数に改行を書き入れる方法」の記事でも bash の助けを借りない方法に触れています。

  2. 参考:「環境に依存しないワンライナーを書くならsedよりperlの方がいい

  3. したがって上記のように苦労して sed を使う必要は無いとも言えます。

54
47
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
54
47