How to strip CR (^M) and leave LF (^J) characters?
Asked Answered
S

10

42

I am trying to use Hexl mode to manually remove some special characters from a text file and don't see how to delete anything in Hexl mode.

What I really want is to remove carriage return and keep linefeed characters.
Is Hexl mode the right way to do this?

Shalna answered 23/7, 2009 at 13:12 Comment(4)
If it's a text file... why use hexl mode?Pasteboard
I'm trying to remove a carriage return and leave a line feed...don't ask - the program that's reading this config file wants it that way.Shalna
+1 I had a similar issue. For some odd reason, a bunch of hex characters were prepended to the beginning of some of my text files. I just want to delete those characters, but can't see them in regular buffer mode. Why is the "delete" feature so hard for hexl-mode? It must be there.Wesle
Closely related: https://mcmap.net/q/127166/-what-are-these-m-39-s-that-keep-showing-up-in-my-files-in-emacs.Micropyle
C
10

No need for hexl-mode for this. Just do a global-search-and-replace of ^J^M with ^J Works for me. :) Then save the file, kill the buffer, and revisit the file so the window shows the new file mode (Unix vs DOS).

Clariceclarie answered 23/7, 2009 at 18:25 Comment(3)
Why even bother to do this? Do what keysersoze suggests and use dos2unix and/or unix2dos.Stinson
Instead of killing the buffer and revisiting the file, you can click on the EOL type indicator in the mode line to cycle through the different options. This way you won't lose your kill ring.Antacid
would have been helpful to note how to actually do this - M-% doesn't work like this for meAberdeen
S
101

No need to find replace. Just use.

M-x delete-trailing-whitespace

You can also set the file encoding through

C-x RET f unix
Stromberg answered 10/12, 2010 at 5:28 Comment(0)
C
33

Oops. That ^J^M needs to be entered as two literal characters. Use c-q c-j, c-q c-m and for the replacement string, use c-q c-j.

Clariceclarie answered 23/7, 2009 at 18:29 Comment(2)
I can't believe how few votes this has! This would totally save a novice (or forgetful) Emacs user!Browne
Yes, this should be higher. Also, you can just replace ^M and ignore the ^J.Photomap
C
10

No need for hexl-mode for this. Just do a global-search-and-replace of ^J^M with ^J Works for me. :) Then save the file, kill the buffer, and revisit the file so the window shows the new file mode (Unix vs DOS).

Clariceclarie answered 23/7, 2009 at 18:25 Comment(3)
Why even bother to do this? Do what keysersoze suggests and use dos2unix and/or unix2dos.Stinson
Instead of killing the buffer and revisiting the file, you can click on the EOL type indicator in the mode line to cycle through the different options. This way you won't lose your kill ring.Antacid
would have been helpful to note how to actually do this - M-% doesn't work like this for meAberdeen
E
9

There's also a command-line tool called unix2dos/dos2unix that exists specifically to convert line endings.

Essex answered 27/7, 2009 at 19:14 Comment(0)
V
8

Assuming you want a DOS encoded file to be changed into UNIX encoding, use M-x set-buffer-file-coding-system (C-x RET f) to set the coding-system to "unix" and save the file.

Vershen answered 28/7, 2009 at 7:35 Comment(0)
P
6

If you want to remove a carriage return (usually displayed as ^M) and leave the line feed. You can just visit the file w/out any conversion:

M-x find-file-literally /path/to/file

Because a file with carriage returns is generally displayed in DOS mode (hiding the carriage returns). The mode line will likely display (DOS) on the left side.

Once you've done that, the ^M will show up and you can delete them like you would any character.

Pasteboard answered 23/7, 2009 at 18:7 Comment(0)
A
4

You don't need to use hexl-mode. Instead:

  • open file in a way that shows you those ^M's. See M-x find-file-literally /path/to/file above. In XEmacs you can also do C-u C-x C-f and select binary encoding.
  • select the string you want replace and copy it using M-w
  • do M-% (query replace) and paste what you want to copy using C-y
  • present Enter when prompted to what replace it with
  • possible press ! now to replace all occurrences

The point is that even if you don't how to enter what you are trying to replace, you can always select/copy it.

Alex answered 28/7, 2009 at 0:48 Comment(1)
Thanks, didn't know about find-file-literally, actually a better tool for seeing control characters in text files than hexl mode which I'd been using.Betray
A
3

(in hexl mode) I'm not sure that you can delete characters. I've always converted them to spaces or some other character, switched to the regular text editor, and deleted them there.

Amarillas answered 23/7, 2009 at 13:34 Comment(0)
K
2

I use this function:

(defun l/cr-sanitise ()
  "Make sure current buffer uses unix-utf8 encoding.
If necessary remove superfluous ^M. Buffer will need to be saved
for changes to be permanent."
  (interactive)
    (set-buffer-file-coding-system 'utf-8-unix)
    (delete-trailing-whitespace)
    (message "Please save buffer to persist encoding changes."))
Katykatya answered 17/12, 2019 at 8:36 Comment(0)
O
1

From http://www.xsteve.at/prg/emacs/xsteve-functions.el:

;02.02.2000
(defun xsteve-remove-control-M ()
  "Remove ^M at end of line in the whole buffer."
  (interactive)
  (save-match-data
    (save-excursion
      (let ((remove-count 0))
        (goto-char (point-min))
        (while (re-search-forward (concat (char-to-string 13) "$") (point-max) t)
          (setq remove-count (+ remove-count 1))
          (replace-match "" nil nil))
        (message (format "%d ^M removed from buffer." remove-count))))))

Add this to your .emacs and run it via M-x xsteve-remove-control-M or bind it to a easier key. It will strip the ^Ms in anymode.

Orren answered 12/8, 2009 at 3:52 Comment(1)
This is a great solution. One command to fix the whole file instantly.C

© 2022 - 2024 — McMap. All rights reserved.