9

Suppose you are working on a very old unix server where dos2unix, perl, tr, and sed are not present. How can you convert files from dos to unix format?

user664833
  • 199
  • 1
  • 5
Hemant
  • 6,834
  • 5
  • 38
  • 42

2 Answers2

12

I think you are referring to removing the caret-M at the end of lines. You can use search and replace in vi to do this.

In vi I normally do: (where "^" represents CTRL):

:%s/^V^M//g

Which shows on the screen as:

:%s/^M//g
jjclarkson
  • 2,147
  • 2
  • 17
  • 16
  • thanks that worked :). I think its a very portable solution. – Hemant Aug 12 '10 at 16:06
  • 4
    You can also use sed to do the same thing w/out having to vim the file: sed -e '%s/^V^M//g' filename That also will show on the screen as sed e '%s/^M//g' filename In general, if you can search/replace it in vim, the command is virtually the same in sed. – gabe. Aug 12 '10 at 19:09
  • 2
    @gabe: the sed solution is actually even more portable +1 :) – wzzrd Aug 12 '10 at 20:54
  • @wzzrd, `sed` and `vi` are both [specified by POSIX](http://pubs.opengroup.org/onlinepubs/9699919799/), and that `vi` command doesn't use any Vim extensions. – Wildcard Apr 16 '16 at 02:11
  • @jjclarkson what does `^V` and '^M' mean? – cokedude Apr 28 '16 at 22:10
  • @gabe. is my sed to old to do this `$ sed -e '%s/^M//g' cookies sed: -e expression #1, char 1: unknown command: `%' ` ? – cokedude Apr 28 '16 at 22:11
6

A server without tr or sed would have to be really old, or missing some basic commands. Hopefully ed is there; it existed in Unix first edition.

ed /path/to/file
1,$s/^V^M$//
w
q

where ^V^M means typing Ctrl+V then Ctrl+M (to enter a literal line feed). If you know that all lines do end in CR LF, you can use 1,$s/.$// instead (indiscriminately remove the last character on each line).

Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175