How to add a carriage return before every newline?
I have a file that only uses n
for new lines, but I need it to have rn
for each new line. How can I do this?
For example, I solved it in Vim using :%s/n/rn/g
, but I would like to use a script or command-line application. Any suggestions?
I tried looking this up with sed
or grep
, but I got immediately confused by the escape sequence workarounds (I am a bit green with these commands).
If interested, the application is related to my question/answer here
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
You can use unix2dos (which found on Debian):
unix2dos file
Note that this implementation won’t insert a
CR
before every LF
, only before those LF
s that are not already preceded by one (and only one) CR
and will skip binary files (those that contain byte values in the 0x0 -> 0x1f range other than LF
, FF
, TAB
or CR
).or use sed
:
CR=$(printf 'r') sed "s/$/$CR/" file
or use
awk
:awk '{printf "%srn", $0}' file
or:
awk -v ORS='rn' 1 file
or use
perl
:perl -pe 's|n|rn|' file
Method 2
This is exactly what unix2dos
does:
$ unix2dos file.txt
That will replace
file.txt
in-place with a version with CRLF line endings.If you want to do it with sed
, you can insert a carriage return at the end of every line:
sed -e 's/$/r/' file.txt
This replaces (
s
) the zero-size area right before the end of the line ($
) with r
. To do in-place replacement (like unix2dos
does), use sed -i.bak
, although that is a non-standard extension – if you don’t have it, use a temporary file.Method 3
If you are doing the conversion on a Unix machine (OS X, Linux), open the file with vi
or vim
:
$ vim my-file
press the ESC key to ensure that you are not in insert mode, then type
:set ff=dos
or
:set fileformat=dos
This does conversion in place by setting the file format.
To write the file and quit the editor use
:wq
On the command line you can do
$ vi +':w ++ff=dos' +':q' my-file
Method 4
Doing this with POSIX is tricky:
-
POSIX Sed does not support
r
or15
. Even if it did, the in place
option-i
is not POSIX -
POSIX Awk does support
r
and15
, however the-i inplace
option
is not POSIX - d2u and dos2unix are not POSIX utilities, but ex is
-
POSIX ex does not support
r
,15
,n
or12
To remove carriage returns:
awk 'BEGIN{RS="1";ORS="";getline;gsub("r","");print>ARGV[1]}' file
To add carriage returns:
awk 'BEGIN{RS="1";ORS="";getline;gsub("n","r&");print>ARGV[1]}' file
Method 5
A portable shell function that will do this:
u2dos() (set -f; IFS=' '; printf '%srn' $(cat "$1"))
With that you can do:
u2dos file >dosfile
Method 6
In awk you can try
awk '{print $0 "r"}'
Or
awk -v r=$'r' '{print $0 r}'
The
$'r'
is an example of ANSI-C style quoting as supported by a few shells like ksh93
, bash
, zsh
, mksh
and FreeBSD sh
and likely to be included in issue 8 of the Single Unix Specification.It offers a general way to express weird characters, try this, for example:
awk -v r=$'U0001F608' '{print $0 r}'
Method 7
You can use GNU sed
command:
sed -i 's/$/x0D/g' file.txt
-
$
– regex for end of line -
x0D
– hex value for carriage return in ASCII
~] cat -v file.txt
line1
line2
line3
line4
~] sed -i 's/$/x0D/g' file.txt
~] cat -v file.txt
line1^M
line2^M
line3^M
line4^M
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0