こんにちは。
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 コマンド
$ echo "aa\nbb\ncc" | perl -pe 's/\\n/\n/g'
aa
bb
cc
tr コマンド
さらに置換対象が一文字ならば、tr が最も簡素と思います。
$ echo "aa:bb:cc" | tr ':' '\n'
aa
bb
cc
-
「シェルの文字列変数に改行を書き入れる方法」の記事でも bash の助けを借りない方法に触れています。 ↩
-
したがって上記のように苦労して sed を使う必要は無いとも言えます。 ↩