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