How to convert DOS/Windows newline (CRLF) to Unix newline (LF)
carriage-return, linefeed, newline, unix, windows
Solution
You can use `tr` to convert from DOS to Unix; however, you can only do this safely if CR appears in your file only as the first byte of a CRLF byte pair. This is usually the case. You then use:
tr -d '\015' <DOS-file >UNIX-file
Note that the name `DOS-file` is different from the name `UNIX-file`; if you try to use the same name twice, you will end up with no data in the file.
You can't do it the other way round (with standard 'tr').
If you know how to enter carriage return into a script (control-V, control-M to enter control-M), then:
sed 's/^M$//' # DOS to Unix
sed 's/$/^M/' # Unix to DOS
where the '^M' is the control-M character. You can also use the `bash` ANSI-C Quoting mechanism to specify the carriage return:
sed $'s/\r$//' # DOS to Unix
sed $'s/$/\r/' # Unix to DOS
However, if you're going to have to do this very often (more than once, roughly speaking), it is far more sensible to install the conversion programs (e.g. `dos2unix` and `unix2dos`, or perhaps `dtou` and `utod`) and use them.
If you need to process entire directories and subdirectories, you can use `zip`:
zip -r -ll zipfile.zip somedir/
unzip zipfile.zip
This will create a zip archive with line endings changed from CRLF to CR. `unzip` will then put the converted files back in place (and ask you file by file - you can answer: Yes-to-all). Credits to @vmsnomad for pointing this out.
Problem
How can I programmatically (not using `vi`) convert DOS/Windows newlines to Unix newlines? The `dos2unix` and `unix2dos` commands are not available on certain systems. How can I emulate them with commands such as `sed`, `awk`, and `tr`?