Differences between revisions 3 and 4
Revision 3 as of 2008-05-21 14:56:55
Size: 1311
Editor: GreyCat
Comment: expand
Revision 4 as of 2008-08-08 02:41:35
Size: 1958
Editor: GreyCat
Comment: explain why
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:

Carriage return characters (CRs) are used in line ending markers on some systems. There are three different kinds of line endings in common use:
 *Unix systems use Line Feeds (LFs) only.
 *MS-DOS and Windows systems use CR-LF pairs.
 *Old Macintosh systems use CRs only.

If you're running a script on a Unix system, the line endings need to be Unix ones (LFs only), or you will have problems. You can check the kind of line endings in use by running:
{{{
cat -e yourscript}}}

If you see something like this:
{{{
command^M$
^M$
another command^M$}}}

then you need to remove the CRs. There are a plethora of ways to do this.

Anchor(faq52)

How do I convert a file from DOS format to UNIX format (remove CRs from CR-LF line terminators)?

Carriage return characters (CRs) are used in line ending markers on some systems. There are three different kinds of line endings in common use:

  • Unix systems use Line Feeds (LFs) only.
  • MS-DOS and Windows systems use CR-LF pairs.
  • Old Macintosh systems use CRs only.

If you're running a script on a Unix system, the line endings need to be Unix ones (LFs only), or you will have problems. You can check the kind of line endings in use by running:

cat -e yourscript

If you see something like this:

command^M$
^M$
another command^M$

then you need to remove the CRs. There are a plethora of ways to do this.

All these are from the [http://www.student.northpark.edu/pemente/sed/sed1line.txt sed one-liners page]:

sed 's/.$//' dosfile              # assumes that all lines end with CR/LF
sed 's/^M$//' dosfile             # in bash/tcsh, press Ctrl-V then Ctrl-M
sed 's/\x0D$//' dosfile           # GNUism - does not work with Unix sed!

If you want to remove all CRs regardless of whether they are at the end of a line, you can use tr:

tr -d '\r' < dosfile

If you want to use the second sed example above, but without embedding a literal CR into your script:

sed $'s/\r$//' dosfile            # BASH only

All of the previous examples write the modified file to standard output. Redirect the output to a new file, and then mv it over top of the original.

There are many more ways:

  • Some systems have a dos2unix command which can do this. Or recode, or fromdos.

  • In vim, you can use :set fileformat=unix to do it.

  • You can use Perl:
    •   perl -pi -e 's/\r\n/\n/' filename
    This has the advantage of overwriting the original file, so you don't have to mess with temporary files.

BashFAQ/052 (last edited 2022-01-30 01:59:53 by larryv)