次のように文字列を変換する方法を探しています。
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