Windows users that introduce their files in Unix (Linux, Mac) systems sometimes have lots of unexpected problems due to end of line codings. You need to think that a file is just a long stream in which it happens that some hidden characters represent end-of-line. The end of lines is represented with different conventions in the Windows (DOS) and Unix (Linux, Mac) worlds as can be seen here:
https://stackoverflow.com/questions/1552749/difference-between-cr-lf-lf-and-cr-line-break-types
Windows uses CR LF and Unix uses LF. OLd Mac uses CR but modern versions use LF.
How can I see these differences?
- the Windows editor Notepad++ shows them
- the Mac editor Visual Studio Code shows its existence here:
- vim shows the type when you open the file:
- the file command shows it too
$ file data.txt
data.txt: ASCII text, with CRLF line terminators
$ file extractDescendants.py
extractDescendants.py: Python script, ASCII text executable
because the last one doesn't say CRLF, then it's LF so it's Unix format.
How can I convert among formats?
Most often you want to convert from Windows (CRLF) to Linux (LF) .
From memory, Notepad++ allows you to save in Linux format.
In Visual Studio Code, click on the bottom sign "CRLF" and see appear a menu that allows to change it:
In the command line:
many servers have the programs flip and dos2unix that allow to do that:
$ flip -h
Usage: flip [-t|-u|-d|-m] filename[s]
Converts ASCII files between Unix, MS-DOS/Windows, or Macintosh newline formats
Options:
-u = convert file(s) to Unix newline format (newline)
-d = convert file(s) to MS-DOS/Windows newline format (linefeed + newline)
-m = convert file(s) to Macintosh newline format (linefeed)
-t = display current file type, no file modifications
$ dos2unix -h
dos2unix 6.0.3 (2013-01-25)
Usage: dos2unix [options] [file ...] [-n infile outfile ...]
if you don't have any of this, you can install flip from here:
https://ccrma.stanford.edu/~craig/utility/flip/
This is how we compiled it for MacOs:
g++ -ansi -O3 flip.cpp -o flip
You only need to use flip -u myfile and it will modify in-place my file to Unix format. (You DON'T need to use flip -m because that Mac format is obsolete now.)
For instance:
$ file mydata.txt
mydata.txt: ASCII text, with CRLF line terminators
$ flip -u mydata.txt
$ file mydata.txt
mydata.txt: ASCII text
No comments:
Post a Comment