Reputation: 19308
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
Reputation: 4628
Instead of using dos2unix
use unix2dos
.
Both are installed with sudo apt install dos2unix
.
Upvotes: 0
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
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
Reputation: 11
Try using:
echo " this is output" > input
sed 's/$/\r/g' input |od -c
Upvotes: 0
Reputation: 755054
dos2unix
onto the machine?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
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
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
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
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