シェルで \n を \\n に置き換えます。

シェルで \n を \\n に置き換えます。

次のように文字列を変換する方法を探しています。

foo\nbar

入力する:

foo\\nbar

これまでに見たことは、tr文字としてのみ機能しているため、これを行うことができず、他の動作する解決策が見つからないということです。

例:

redgl0w@anarchy ~> cat test
foo
bar

私は以下を得ることを願っています:

redgl0w@anarchy ~> echo test
foo\nbar

答え1

バッシュ使用:

$ cat test
foo
bar
baz

$ content=$(<test)

$ joined=${content//$'\n'/\\n}

$ echo "$joined"
foo\nbar\nbaz

答え2

Perlではこれを簡単に行うことができます。

perl -pe 's/\n/\\n/' file

文字列が変数にある場合は、次のようにします。

perl -pe 's/\n/\\n/' <<<"$variable"

または

printf '%s' "$variable" | perl -pe 's/\n/\\n/' 

必要に応じて変数として保存できます。

$ cat test
foo
bar
$ test=$(perl -pe 's/\n/\\n/g' test)
$ echo "$test"
foo\nbar\n

または、最後の末尾の改行を変換せずにファイルがRAMに入るのと同じくらい小さいと仮定すると、次のことができます。

$ test=$(perl -0777 -pe 's/\n/\\n/g; s/\\n$/\n/' test); 
$ echo "$test"
foo\nbar

あるいは、より良い方法が提案された。ラケシュ・シャルマファイルをメモリに保存する必要がないコメントの場合:

$ perl -lpe '$\ = eof ? qq(\n) : q(\n);s/\n/\\n/;' test
foo\nbar

関連情報