Replace newlines with literal \n

RegexSed

Regex Problem Overview


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"}]}]}

Regex Solutions


Solution 1 - Regex

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.

Solution 2 - Regex

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 - Regex

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 - Regex

With the -zoption you can do

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

or

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

Solution 5 - Regex

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'

Solution 6 - Regex

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)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionParzeView Question on Stackoverflow
Solution 1 - RegexEd MortonView Answer on Stackoverflow
Solution 2 - RegexanubhavaView Answer on Stackoverflow
Solution 3 - RegexmvrView Answer on Stackoverflow
Solution 4 - RegexWalter AView Answer on Stackoverflow
Solution 5 - RegexRSXView Answer on Stackoverflow
Solution 6 - RegexvoltentoView Answer on Stackoverflow