Convert CRLF's to line feeds on Linux

34

12

What's the best way to convert CRLF's to line feeds in files on Linux?

I've seen sed commands, but is there anything simpler?

JoelFan

Posted 2009-10-07T05:06:22.460

Reputation: 3 012

4

Dupe: http://superuser.com/questions/38744/how-to-convert-a-text-files-line-termination-from-windows-dos-to-unix. The link provided in the accepted answer covers the dos2unix, perl and vi options among others.

– None – 2009-10-07T09:13:50.417

2This already has better answers though (so if one of these is to be closed, it should probably be that one) – Jonik – 2009-10-07T12:02:43.103

Answers

42

Use this command:

fromdos yourtextfile

The other way around:

todos yourtextfile

These commands are found in the tofrodos package (on most recent distributions), which also provides the two wrappers unix2dos and dos2unix that mimic the old unix tools of the same name.

avelldiroll

Posted 2009-10-07T05:06:22.460

Reputation: 1 998

@Jonik what makes it "Much more useful"? Serious question – andrewtweber – 2015-01-31T22:43:25.613

1

This helped me, the other one didn't. But I really don't remember what my use case was 5+ years ago. :P Also see the original version of the other answer.

– Jonik – 2015-02-02T14:49:48.760

I would give extra bonus if you say how to make it recursive. Currently works only with wildcards. – sorin – 2010-07-03T07:47:32.910

@andrewtweber This answer also answers the very much related question of undoing the conversion and describes which package to install (which is a pain to find out). Also it gives a simple example of how to use the package, whereas the other answer seemed to just have copied the manpage, which is very beginner-unfriendly. Furthermore, the link in the answer is dead by now. – bleistift2 – 2020-02-20T19:02:50.920

2@SorinSbarnea: something like find . -name '*.txt' -print0 | xargs -null fromdos – bstpierre – 2012-07-25T18:49:53.010

2+1 Much more useful than the currently top-voted "Use dos2unix" answer. – Jonik – 2009-10-07T10:00:11.760

1Yeah, even I'm voting this one up. Mine was more of a drive-by suggestion. – Ryan C. Thompson – 2009-10-08T07:26:24.117

24

Use dos2unix.

dos2unix - DOS/MAC to UNIX text file format converter

dos2unix  [options] [-c convmode] [-o file ...] [-n infile outfile ...]

Options:
          [-hkqV] [--help] [--keepdate] [--quiet] [--version]

Ryan C. Thompson

Posted 2009-10-07T05:06:22.460

Reputation: 10 085

2and unix2dos for the other way 'round. – quack quixote – 2009-10-07T05:41:20.253

Quack, are you following me? Not that I don't appreciate it, with all the upvotes. – Ryan C. Thompson – 2009-10-07T06:19:18.133

1dude, i'm ~quack. pronounce "~" as "not". :) but no, not following you, tho i do appear to run into you frequently. – quack quixote – 2009-10-07T07:55:48.267

1

Consider elaborating on how to get this utility for your Linux system. At least on Ubuntu it's not installed by default (but by installing tofrodos package you get something very similar: http://packages.ubuntu.com/jaunty/tofrodos).

– Jonik – 2009-10-07T09:33:58.660

20

I prefer perl:

perl -lne 's/\r//g; print' winfile.txt > unixfile.txt

But that's well-suited to my uses, and it's very easy for me to remember. Not all systems have a dos2unix command, but most that I work on have a perl interpreter.

Another is recode, a powerful replacement for dos2unix and iconv; it's available in the "recode" package in Debian repositories:

recode ibmpc..lat1 winfile.txt   # dos2unix
recode lat1..ibmpc unixfile.txt  # unix2dos

For awk fans:

awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt

...and sed:

sed 's/\r$//' winfile.txt > unixfile.txt

And now, only slightly-less-convoluted than deleting the CR's by hand in a hex editor, straight from one of our stackoverflow.com friends, useable with the beef interpreter (located on your friendly neighborhood Debian repository),

dos2unix in brainfuck!

,[[->+>+<<]>>>,[<-------------[+++++++++++++.>>>]<[>>----------[>+++++++++++++.-------------]<++++++++++>]<<<<[-]>>>[-<<<+>>>]]<[-]<[-]<]++++++++++.

big thanks to jk for wasting an hour of his life to write this!

quack quixote

Posted 2009-10-07T05:06:22.460

Reputation: 37 382

I find it valid because "Not all systems have a dos2unix command, but most that I work on have a perl interpreter." – demongolem – 2016-08-18T15:12:51.173

why not: perl -pe 's/\r//g' winfile.txt > unixfile.txt – JoelFan – 2011-01-25T18:52:29.463

1(useless use of cat and) perl is as complicated as sed... thus you are not really answering the question but rather collecting reputation :) – akira – 2009-10-07T06:28:32.297

2"best way" is subjective. this works best for me (i'm tons more comfortable with perl than sed). i didn't promise it would work best for you. – quack quixote – 2009-10-07T06:32:27.887

@akira: a question can have multiple valid answers. I use this method as well, occasionally, mostly in combination with other changes, so it is definitely a valid answer; but "use dos2unix" is definitely the more practical answer in most situations. So I think the ratings are fine. – reinierpost – 2009-10-07T09:47:39.633

@akira: if you find it simpler, please post it as an answer and enlighten the rest of us. – quack quixote – 2009-10-07T10:31:33.303

@~quack: that is the point: it is not simpler. thats the same for your perl answer. u2d or fromdos/todos are the right answers because they are simpler than any stuff expressed in any other programming language. – akira – 2009-10-07T11:22:23.013

look at quesion 46769 to get an idea what it means to give a correct AND simple answer. – akira – 2009-10-07T11:24:29.203

@~quack: there is a website for this called stackoverflow.com where you can place questions. proposed question "is there an implementation of dos2unix in brainfuck?" ... feel free to steel this question and use it. – akira – 2009-10-07T11:44:14.437

@akira: stackoverflow, huh? where've i heard of that before? – quack quixote – 2009-10-07T11:45:31.330

and now i am tempted to downvote this answer because you are constantly increasing the obsfucating level... (though i voted up 'my own' question on stackoverflow.com) – akira – 2009-10-08T14:52:51.533

9

I do this on Bash:

cat cr_stuffed.file | tr -d \r > no_more_crs.file

JustJeff

Posted 2009-10-07T05:06:22.460

Reputation: 575

nice. i saw another mention of tr earlier today. it's not a program that gets mentioned very often is it? – quack quixote – 2009-10-07T23:46:16.143

7

I think you can use tr, as well (though I have no funny format files on which to try):

tr -d '\r' < file1 > file2

warren

Posted 2009-10-07T05:06:22.460

Reputation: 8 599

4

I found a very easy way… Open file with nano: ## nano file.txt

press Ctrl+O to save, but before pressing Enter press: Alt+D to toggle betwen DOS and Unix/Linux line-endings, or: Alt+M to toggle betwen Mac and Unix/Linux line-endings then press Enter to save and Ctrl+X to quit.

Stefan Sjöberg

Posted 2009-10-07T05:06:22.460

Reputation: 39

1Could you [edit] your answer to clarify which toggle settings will replicate the behaviour requested by the OP? – Burgi – 2016-05-01T01:52:22.277

The OP wants to toggle off DOS line endings, so Alt+d. Sometimes alt gets intercepted by the terminal program, so you can use esc+d instead. – spinup – 2016-08-25T14:56:47.473

1Lots of nano shortcuts also work with Shift pressed, which often prevents terminal interception, so 'Alt-Shift-D' works too. – mwfearnley – 2017-03-02T10:45:23.413

4

In vi or Vim:

:%s/^V^M//g

fpmurphy

Posted 2009-10-07T05:06:22.460

Reputation: 1 260

3

I prefer Vim and :set fileformat=unix. While not the fastest, it does give me a preview. It is especially useful in the case of a file with mixed endings.

opello

Posted 2009-10-07T05:06:22.460

Reputation: 696

1

CR LF to LF using awk:

awk -v RS='\r?\n' 1
command | awk -v RS='\r?\n' 1
awk -v RS='\r?\n' 1 filename

Usage example:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' 1 | hexdump -C

Explanation:

-v RS='\r?\n' sets variable RS (input record separator) to \r?\n, meaning input is read line by line separated by LF (\n) which may (?) be preceded by CR (\r).

1 is the script awk executes. A script consists of condition { action }. In this case, 1 is the condition which evaluates to true. The action is omitted, so the default action is executed, which means print the current line (which could also be written as {print $0} or simply {print}).


LF to CR LF: You can set the variable ORS (output record separator) to modify the line ends of the output. Example:

echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' -v ORS='\r\n' 1 | hexdump -C

Martin

Posted 2009-10-07T05:06:22.460

Reputation: 152

1

Use Perl's generic \R in a regex. That way, you can convert files with any of CR, CRLF or already LF or a mix of them (yes, there are files which mix 2 different newline conventions!).

perl -i.bak -pe 's/\R/\n/g' $yourfile

(-i.bak tells perl to convert the file in-place, saving the original as ${yourfile}.bak)

More info on \R in this answer

mivk

Posted 2009-10-07T05:06:22.460

Reputation: 2 270

1

If you want a GUI method, try the Kate text editor (other advanced text editors may be able to handle this too). Open the find / Replace dialog (Ctrl+R), and replace \r\n with \n. (NB: you'll need to choose "Regular expression" from the drop down and deselect "Selection only" from the options.)

EDIT: Or, if you simply want to convert to Unix format, then use the menu option Tools > End of Line > Unix.

DisgruntledGoat

Posted 2009-10-07T05:06:22.460

Reputation: 4 068

There are text editors, such as jEdit, that can do these transformations automatically - you just tell it if you want Unix, Windows or Mac line separators. – Jonik – 2009-10-07T10:24:38.030

Actually, KATE can do that too through the Tools > End of Line menu. Maybe I should have thought more laterally than answering the question exactly as it was worded - but if you know you specifically want to convert \r\n to \n then using search/replace is easier than remembering which OS uses which line ending. ;) – DisgruntledGoat – 2009-10-10T23:22:10.480

1

Paste this into dos2unix.py Python script.

#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys

if len(sys.argv[1:]) != 2:
  sys.exit(__doc__)

content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
  content = infile.read()
with open(sys.argv[2], 'wb') as output:
  for line in content.splitlines():
    outsize += len(line) + 1
    output.write(line + '\n')

print("Done. Saved %s bytes." % (len(content)-outsize))

Should work on any platform with Python installed. Public domain.

anatoly techtonik

Posted 2009-10-07T05:06:22.460

Reputation: 242

0

I used this script for files I needed to emergency transfer files from a windows system to a unix system.

 find . -type f | xargs file | grep CRLF | cut -d: -f1 | xargs dos2unix

find . -type f

Finds all the files, recursively in the directory you're running the command from

xargs file

Pass it to the file program to get an analysis of the file.

grep CRLF

We only want the output of file that shows CRLF.

cut -d: -f1

Get the output up to to the color. discard the rest. We should only have a filename now

xargs dos2unix

Pass the filename to the program dos2unix using xargs.

Tschallacka

Posted 2009-10-07T05:06:22.460

Reputation: 121