41
Help us understand the problem. What are the problem?

posted at

updated at

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

こんにちは。
sed による置換で改行\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 (GNU/POSIX/BSD/MacOSX)で動かすためには一手間必要でした。ただし、\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 を使う必要は無いとも言えます。 

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
41
Help us understand the problem. What are the problem?