Replace newlines with literal \n
This stackoverflow question has an answer to replace newlines with sed, using the format sed ':a;N;$!ba;s/\n/ /g'.
This works, but not for special characters like \r, \n, etc.
What I'm trying to do is to replace the newline character by a literal \n. Tried
sed ':a;N;$!ba;s/\n/\\n/g'
and
sed ':a;N;$!ba;s/\n/\\\n/g'
also
sed ":a;N;$!ba;s/\n/'\'n/g"
but all to no avail. Sed keeps replacing the newline character.... with a newline character.
Thoughts?
Edited after first answer:
For the sake of completeness the commands run are :
PostContent=cat $TextTable | sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g'
Where TextTable is a variable linking to a text file containing a JSON output in the following format :
{"posts":[{"title":"mysupertest","slug":"bi-test","markdown":"##TEST
First things first !
To TEST this TEST TEST, click the download button below.
If you need more information about the TEST TEST, you can read the Table of Contents below.
<a href='/assets/TEST.pdf' style='border-radius:5px; padding: 4px 15px; background-color:#008CBA; color:white; text-decoration:none; float:right;' download> Download </a>
##TEST OF TEST
###TEST TEST PLATFORM TEST GUIDE
WaTESTve TEST SetupTEST
TESTTEST
TESTTESTETESTTETSTTEST
TESTTESTTTETST
TESTTES
TESTTESTESSTSTESTESTTES
TEST","image":"http://localhost:3000/myimage.jpg","featured":false,"page":false,"status":"draft","language":"en_US","meta_title":null,"meta_description":null,"author":"4","publishedBy":null,"tags":[{"uuid":"ember2034","name":"implementation guides","slug":null,"description":null,"meta_title":null,"meta_description":null,"image":null,"visibility":"public"}]}]}
Solution 1:
Is this all you're trying to do?
$ cat file
a
b
c
$ awk '{printf "%s\\n", $0}' file
a\nb\nc\n$
or even:
$ awk -v ORS='\\n' '1' file
a\nb\nc\n$
Run dos2unix on the input file first to strip the \r
s if you like, or use -v RS='\r?\n'
with GNU awk or do sub(/\r$/,"");
before the printf or any other of a dozen or so clear, simple ways to handle it.
sed is for simple substitutions on individual lines, that is all. For anything else you should be using awk.
Solution 2:
This should work with both LF
or CR-LF
line endings:
sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g' file
Solution 3:
You could do this using sed
and tr
:
sed 's/$/\\n/' file | tr -d '\n'
However this will add an extra \n
at the end.
Solution 4:
With the -z
option you can do
sed -z 's/\n/\\n/g' file
or
sed -z "s/\n/\\\n/g" file