Hot to replace newline characters with a string in sed

Solution 1:

Easier to use perl than sed, since it has (by default, at least) a more straightforward treatment of the newlines in its input:

printf '%s'   ''  | perl -pe 's/\n/\\\n/' # Empty string
printf '%s'   a   | perl -pe 's/\n/\\\n/' # a
printf '%s\n' a   | perl -pe 's/\n/\\\n/' # a\<newline>
printf '%s\n' a b | perl -pe 's/\n/\\\n/' # a\<newline>b\<newline>
# etc

If your inputs aren't huge, you could use

perl -0777 -pe 's/\n/\\\n/g'

instead to read the entire input at once instead of line by line, which can be more efficient.

Solution 2:

how to replace newline charackters with a string in sed

It's not possible. From sed script point of view, the trailing line missing or not makes no difference and is undetectable.

Aaaanyway, use GNU sed with sed -z:

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

Solution 3:

GNU awk can use the RT variable to detect a missing record terminator:

$ printf 'a\nb\n' | gawk '{ORS=(RT != "" ? "\\" : "") RT} 1' 
a\
b\
$ printf 'a\nb' | gawk '{ORS=(RT != "" ? "\\" : "") RT} 1'
a\
b$ 

This adds a "\" before each non-empty record terminator.

Using any awk:

$ printf 'a\nb\n\n' | awk '{printf "%s%s", sep, $0; sep="\\\n"}'
a\
b\
$ printf 'a\nb\n' | awk '{printf "%s%s", sep, $0; sep="\\\n"}'
a\
b$ 

Or { cat file; echo; } | awk ... – always add a newline to the input.