106

We have 10 PC with some version of Ubuntu and only remote access. While doing some upgrades to custom software I did not notice that the line endings in some scripts were Windows version (CR+LF) and not the Unix version (LF). So now when I want to launch the script it gives an error:

bash: /usr/local/bin/portsee: /usr/bin/python^M: bad interpreter: No such file or directory

Is there a way to change all line endings in a script from terminal. The thing is that I can not install any new software to this group of PC-s.

1
  • 1
    Use the sed command from the duplicate's accepted answer.
    – terdon
    Jul 26, 2016 at 15:07

2 Answers 2

177

Option 1: dos2unix

You can use the program dos2unix, which is specifically designed for this:

dos2unix file.txt

will replace all CR from all lines, in place operation.

To save the output in a different file:

dos2unix -n file.txt output.txt

You might need to install it first by:

sudo apt-get install dos2unix

Option 2: sed

Or you can use sed to replace all CR (\r) from line endings:

sed -i.bak 's/\r$//' file.txt

With option -i, the file will be edited in-place, and the original file will be backed up as file.txt.bak.

4
  • 3
    dos2unix and unix2dos are present in cygwin as well
    – Pallav Jha
    Jul 23, 2019 at 9:00
  • 2
    This answer shows applying dos2unix recursively. Useful when moving a git repo from windows to ubuntu. Aug 3, 2020 at 8:11
  • 3
    sed worked for me but had to supply the global flag as in: sed -i.bak 's/\r$//g' file.txt
    – Jono
    Nov 2, 2020 at 17:58
  • If anyone else gets an illegal byte sequence error when using the sed command, just add this one the same line before the sed command: LC_ALL=C sed ...
    – Nate
    Nov 8, 2021 at 22:12
6

The sed solution is not portable to all platforms. It didn't work for me on macOS unless I did brew install gsed and used gsed 's/\r$//'.

For a solution that works in most places without installing anything, I use

tr -d '\r'

To edit a file in-place, I produce the new data in a subshell before erasing and overwriting the original file:

echo "$(tr -d '\r' < file)" > file
2
  • Sponge from moreutils is a nice utility for reading and writing in the same line as well: tr -d '\r' <file | sponge file. It writes to memory until STDOUT finishes, then writes the contents to the file.
    – David
    Oct 27, 2021 at 12:02
  • Useful if you have sponge installed, but it's not installed by default on macOS. May 13, 2022 at 20:12

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.