В emacs, как удалить символы CR (^ M) и оставить символы LF (^ J)?

Я пытаюсь использовать шестнадцатеричный режим, чтобы вручную удалить некоторые специальные символы из текстового файла, и не вижу, как что-либо удалить в шестнадцатеричном режиме.

Что я действительно хочу, так это удалить возврат каретки и сохранить символы перевода строки. Является ли режим Hexl правильным способом сделать это?


person Brandon Leiran    schedule 23.07.2009    source источник
comment
Если это текстовый файл... зачем использовать шестнадцатеричный режим?   -  person Trey Jackson    schedule 23.07.2009
comment
Я пытаюсь убрать возврат каретки и оставить перевод строки... не спрашивайте - программа, которая читает этот конфигурационный файл, так хочет.   -  person Brandon Leiran    schedule 23.07.2009
comment
+1 У меня была похожая проблема. По какой-то странной причине к началу некоторых моих текстовых файлов добавлялась куча шестнадцатеричных символов. Я просто хочу удалить эти символы, но не вижу их в обычном буферном режиме. Почему функция удаления так сложна для шестнадцатеричного режима? Он должен быть там.   -  person User1    schedule 22.06.2010


Ответы (10)


Для этого не нужен шестнадцатеричный режим. Просто выполните глобальный поиск и замену ^J^M на ^J Работает для меня. :) Затем сохраните файл, уничтожьте буфер и снова откройте файл, чтобы в окне отображался новый режим файла (Unix или DOS).

person Community    schedule 23.07.2009
comment
Зачем вообще это делать? Делайте то, что предлагает keyersoze, и используйте dos2unix и/или unix2dos. - person Thomas Owens; 27.07.2009
comment
Вместо уничтожения буфера и повторного просмотра файла вы можете щелкнуть индикатор типа EOL в строке режима, чтобы просмотреть различные параметры. Таким образом, вы не потеряете кольцо убийства. - person phils; 12.12.2010
comment
было бы полезно отметить, как на самом деле это сделать - M-% у меня так не работает - person baxx; 19.10.2015

Не нужно искать замену. Просто используйте.

M-x delete-trailing-whitespace

Вы также можете установить кодировку файла через

C-x RET f unix
person CantGetANick    schedule 10.12.2010

Упс. Это ^J^M нужно вводить как два буквальных символа. Используйте c-q c-j, c-q c-m, а для строки замены используйте c-q c-j.

person Community    schedule 23.07.2009
comment
Не могу поверить, как мало голосов! Это полностью спасло бы начинающего (или забывчивого) пользователя Emacs! - person Ogre Psalm33; 13.01.2015
comment
Да, это должно быть выше. Кроме того, вы можете просто заменить ^M и игнорировать ^J. - person Ashton Honnecke; 13.11.2015

Существует также инструмент командной строки под названием unix2dos/dos2unix, который существует специально для преобразования концов строк.

person KeyserSoze    schedule 27.07.2009

Предполагая, что вы хотите преобразовать файл, закодированный в DOS, в кодировку UNIX, используйте M-x set-buffer-file-coding-system (C-x RET f), чтобы установить систему кодирования на «unix» и сохранить файл.

person remvee    schedule 28.07.2009

Если вы хотите удалить возврат каретки (обычно отображается как ^M) и оставить перевод строки. Вы можете просто посетить файл без какого-либо преобразования:

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

Потому что файл с возвратом каретки обычно отображается в режиме DOS (скрывая возврат каретки). Строка режима, скорее всего, будет отображать (DOS) с левой стороны.

Как только вы это сделаете, появятся ^M, и вы сможете удалить их, как любой другой персонаж.

person Trey Jackson    schedule 23.07.2009

Вам не нужно использовать шестнадцатеричный режим. Вместо:

  • откройте файл так, чтобы он показывал вам эти ^M. См. M-x find-file-literally /path/to/file выше. В XEmacs вы также можете сделать C-u C-x C-f и выбрать двоичное кодирование.
  • выберите строку, которую вы хотите заменить, и скопируйте ее, используя M-w
  • сделайте M-% (запрос замены) и вставьте то, что вы хотите скопировать, используя C-y
  • присутствует Введите, когда будет предложено заменить его на
  • возможен пресс ! теперь заменить все вхождения

Дело в том, что даже если вы не знаете, как ввести то, что пытаетесь заменить, вы всегда можете это выбрать/скопировать.

person Gleb    schedule 28.07.2009
comment
Спасибо, не знал о find-file-буквально, на самом деле это лучший инструмент для просмотра управляющих символов в текстовых файлах, чем режим hexl, который я использовал. - person Marc Stober; 22.11.2011

(в шестнадцатеричном режиме) Я не уверен, что вы можете удалять символы. Я всегда преобразовывал их в пробелы или какой-то другой символ, переключался на обычный текстовый редактор и удалял их там.

person Chris Arguin    schedule 23.07.2009

Из 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))))))

Добавьте это в свой .emacs и запустите через M-x xsteve-remove-control-M или привяжите к более простому ключу. Это лишит ^M в любом режиме.

person ayman    schedule 12.08.2009
comment
Это отличное решение. Одна команда для мгновенного исправления всего файла. - person DOKKA; 20.08.2014

Я использую эту функцию:

(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."))
person gsl    schedule 17.12.2019