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"}]}]}
75170 次浏览

This should work with both LF or CR-LF line endings:

sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g' file

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 \rs 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.

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.

Here is little python script for replacing the '\r\n' with '\r' in directory in a recursive way import os import sys

if len(sys.argv) < 2:
print("Wrong arguments. Expected path to directory as arg 1.")
exit(1)


path = sys.argv[1]




def RecOpOnDir(path, op) :
for f in os.listdir(path):
full_f = path + "/" + f
if os.path.isdir(full_f):
RecOpOnDir(full_f, op)
else:
try:
op(full_f)
except Exception as ex:
print("Exception during proc '", full_f, "' Exception:", ex)


file_counter = 0


def WinEndingToUnix(path_to_file):
global file_counter
file_counter += 1
file_strs = []
with open(path_to_file) as f:
for line in f:
file_strs.append(line.replace(r"\r\n", r"\n"))


with open(path_to_file, "w") as fw:
fw.writelines(l for l in file_strs)


try:
RecOpOnDir(path, WinEndingToUnix)
print("Completed.", file_counter, "files was reformed")
except Exception as ex:
print("Exception occured: ", ex)
exit(1)

In case it helps anyone, I was searching for the opposite of this question: to replace literal '\'n in a string with newline. I managed to solve it with sed like this:

_s="foo\nbar\n"
echo $_s | sed 's/\\n/\n/g'

With the -zoption you can do

sed -z 's/\n/\\n/g' file

or

sed -z "s/\n/\\\n/g" file