John M Gant
John M Gant

Reputation: 19308

Replace \n with \r\n in Unix file

I'm trying to do the opposite of this question, replacing Unix line endings with Windows line endings, so that I can use SQL Server bcp over samba to import the file. I have sed installed but not dos2unix. I tried reversing the examples but to no avail.

Here's the command I'm using.

sed -e 's/\n/\r\n/g' myfile

I executed this and then ran od -c myfile, expecting to see \r\n where there used to be \n. But there all still \n. (Or at least they appear to be. The output of od overflows my screen buffer, so I don't get to see the beginning of the file).

I haven't been able to figure out what I'm doing wrong. Any suggestions?

Upvotes: 15

Views: 34362

Answers (9)

jawira
jawira

Reputation: 4628

Instead of using dos2unix use unix2dos.

Both are installed with sudo apt install dos2unix.

Upvotes: 0

Carolina
Carolina

Reputation: 1

Doing this

sed 's/\([^\r]\)$/\0\r/'

it worked really well, after this I was able to recover the unique lines. All my duplicates disappear because some of them have /n and others /r/n.

Upvotes: 0

Da Qi
Da Qi

Reputation: 645

 sed 's/\([^^M]\)$/\0^M/' your_file

This makes sure you only insert a \r when there is no \r before \n. This worked for me.

Upvotes: 1

K Suresh Babu
K Suresh Babu

Reputation: 11

Try using:

echo " this is output" > input
sed 's/$/\r/g' input |od -c

Upvotes: 0

Jonathan Leffler
Jonathan Leffler

Reputation: 755054

  • What is the problem with getting dos2unix onto the machine?
  • What is the platform you are working with?
  • Do you have GNU sed or regular non-GNU sed?

On Solaris, /usr/bin/sed requires:

sed 's/$/^M/'

where I entered the '^M' by typing controlV controlM. The '$' matches at the end of the line, and replaces the end of line with the control-M. You can script that, too.

Mechanisms expecting sed to expand '\r' or '\\r' to control-M are going to be platform-specific, at best.

Upvotes: 15

hlovdal
hlovdal

Reputation: 28268

Just adding a \r (aka ^M, see Jonathan Leffler's answer) in front of \n is not safe because the file might have mixed mode EOL, so then you risk ending up with some lines becomming \r\r\n. The safe thing to do is first remove all '\r' characters, and then insert (a single) \r before \n.

#!/bin/sh
sed 's/^M//g' ${1+"$@"} | sed 's/$/^M/'

Updated to use ^M.

Upvotes: 1

dlamblin
dlamblin

Reputation: 45381

When faced with this, I use a simple perl one-liner:

perl -pi -e 's/\n/\r\n/' filename

because sed behavior varies, and I know this works.

Upvotes: 19

mob
mob

Reputation: 118695

You don't need the -e option.

$ matches the endline character. This sed command will insert a \r character before the end of line:

sed 's/$/\r/' myfile 

Upvotes: 5

Juparave
Juparave

Reputation: 706

Maybe if you try it this way

cat myfile | sed 's/\n/\r\n/g' > myfile.win

will work, from my understanding your just making the replacements to the console output, you need to redirect output to a file, in this case myfile.win, then you could just rename it to whatever you want. The whole script would be (running inside a directory full of this kind of files):

#!/bin/bash
for file in $(find . -type f -name '*')
do
  cat $file | sed 's/\n/\r\n/g' > $file.new
  mv -f $file.new $file
done 

Upvotes: -1

Related Questions