Back
Featured image of post Convert a multi line string into a single line string leaving newline characters(LF \n) with sed

Convert a multi line string into a single line string leaving newline characters(LF \n) with sed

sedで複数行の文字列を改行文字(LF \n)つきの1行に変換する

日本語/Japanese

Summary

sed command can convert a multi line string into a single line string without deleting \n.

# a multi line string
$ cat text
aaa
bbb
ccc

# convert a multi line string into a single line
$ cat text | sed -z 's/\n//g'
aaabbbccc

# leave newline characters(\n)
$ cat text | sed -z 's/\n/\\n/g'
aaa\nbbb\nccc\n\n

Prerequisites

  • sed (GNU sed) 4.7
    • NOTE: BSD sed has different options

Detail

I wanted to convert a multi line string into a single line string, leaving newline characters in place.

# a multi line string
$ cat text
aaa
bbb
ccc

sed -z can treat newline characters(\n) as normal characters.
Here is what I often do.

# convert a multi line string into a single line
$ cat text | sed -z 's/\n//g'
aaabbbccc

# "-z" cannot be omitted
$ cat text | sed 's/\n//g'
aaa
bbb
ccc

This time, I tried an another method because I had to leave newline characters.

$ cat text | sed -z 's/\n/\\n/g'
aaa\nbbb\nccc\n\n

Good.
It seems to be working.

(The following is the same content in Japanese.)

まとめ

こんな感じで複数行の文字列を\nを含んだまま1行にできる。

# 複数行の文字列
$ cat text
aaa
bbb
ccc

# 普通に改行文字を消す
$ cat text | sed -z 's/\n//g'
aaabbbccc

# 改行文字を\nとして表示するが改行はしない
$ cat text | sed -z 's/\n/\\n/g'
aaa\nbbb\nccc\n\n

環境

  • sed (GNU sed) 4.7
    • Macにデフォルトで入ってるBSD版のsedだとオプションが違うので注意

詳細

複数行の文字列を改行文字(\n)を残したまま1行に変換したいことがあった。

# 複数行の文字列
$ cat text
aaa
bbb
ccc

sedの-zオプションを使うと改行文字(\n)を操作できる。
よくやるのはこんな感じ。

# 改行文字を消して1行にする
$ cat text | sed -z 's/\n//g'
aaabbbccc

# -zオプションがないと改行文字を操作できない
$ cat text | sed 's/\n//g'
aaa
bbb
ccc

今回は改行は無くしたいが改行文字(\n)は残したかったので、
次のように書いてみた。

$ cat text | sed -z 's/\n/\\n/g'
aaa\nbbb\nccc\n\n

いい感じ。

おわり

なんかJSONの値に改行文字を含むテキストの内容を入れたくなることがあったんだけど調べてもやり方がすぐに出てこなかったので試してみた。
他にもっと簡単な方法があるかも?

おまけ

凛々しいねこ
凛々しいねこ

Built with Hugo
Theme Stack designed by Jimmy