Что такое `^ M` и как мне от него избавиться?


134

Когда я открываю файл vim, я вижу странные ^Mсимволы.

К сожалению, любимая в мире поисковая система не справляется со специальными символами в запросах, поэтому я спрашиваю здесь:

  • Что это за ^Mперсонаж?

  • Как он мог туда добраться?

  • Как мне от этого избавиться?


3
Властимил это было бессмысленно редактировать. Получил правильное прошедшее время в британском английском.
— Jesse_b

1
Это символ диграф управления, для получения дополнительной информации: help digraph-table.
— Эрик Лещинский

Ответы:


108

Символ ^Mвозврата каретки. Если вы видите это, вы, вероятно, смотрите на файл, созданный в мире DOS / Windows, где конец строки отмечен парой возврата каретки / перевода строки, тогда как в мире Unix конец строки отмечен одной новой строкой.

Прочитайте эту статью для более подробной информации, а также запись в Википедии для новой строки .

В этой статье обсуждается, как настроить vim для прозрачного редактирования файлов с разными маркерами конца строки.

Если у вас есть файл ^Mв конце некоторых строк, и вы хотите избавиться от них, используйте это в Vim:

:s/^M$//

(Нажмите Ctrl+ V Ctrl+, Mчтобы вставить это ^M.)


11
Попробуйте :%s/^M/\r/gвместо этого удалить ^Mи заменить ^Mсимвол новой строки \r. Без %, команда применяется только для текущей строки. И я наткнулся на несколько примеров , когда ^Mне является в конце строки, такие какThe first line.^MThe second line.
— Джордж

Или, если вы не хотите много разрывов строк, вы можете просто сделать это:%s/^M/
— carenownow1

2
Если это просто возврат каретки, то это может быть классический (до Unix) разрыв строки Macintosh. Даже некоторые новые программы, такие как Excel 2007 для Mac, делают это по некоторым причинам.
— Судо

@larsks Но altap.cz/salamander/help/salamand/appendix_txtfiles говорит, что ^Mиспользуется в UNIX
— Vivek

В статье, на которую вы ссылаетесь, говорится, что \nона используется в Unix, и это правильно. Это код ASCII 10, иначе известный как ^J.
— Жаворонки

39

В большинстве операционных систем UNIX есть утилита dos2unix, которая преобразует CRLF в LF. Другие ответы охватывают вопрос «что они».


36

Более простой способ сделать это - использовать следующую команду:

dos2unix filename

Эта команда также работает с шаблонами пути, например

dos2unix path/name*

Если это не работает, попробуйте использовать другой режим:

dos2unix -c mac filename
  • -cУстановите режим конвертации. Где CONVMODE является одним из: ascii, 7bit, iso, macс asciiпо - умолчанию.

22

Это сработало для меня

:e ++ff=dos 

Команда: e ++ ff = dos говорит Vim снова прочитать файл, форсируя формат файла dos. Vim удалит окончания строк только в CRLF и LF, оставив в буфере только текст каждой строки.

тогда

:set ff=unix 

и наконец

:wq 

3
Спасибо! это сработало для меня, но принятое решение не
— помогло

Имеет отношение ffк формату файла? Как насчет ++ff?
— KcFnMi

Команда: e ++ ff = dos говорит Vim снова прочитать файл, форсируя формат файла dos. Vim удалит окончания строк только в CRLF и LF, оставив в буфере только текст каждой строки.
— Страйкер

10

Еще один способ избавиться от возврата каретки с помощью trкоманды.

У меня есть небольшой скрипт, который выглядит так

#!/bin/sh
tmpfile=$(mktemp)
tr -d '\r' <"$1" >"$tmpfile"
mv "$tmpfile" "$1"

6

Вы можете очистить это с sed:

sed -e 's/^M$//' < infile > outfile

Хитрость в том, как правильно войти в каретку. Как правило, вам нужно набрать, C-v C-mчтобы ввести буквальный возврат каретки. Вы также можете иметь возможность работать с

sed -i.bak -e 's/^M$//' infile

2

Что это ^ М?
^ M - символ возврата каретки. Если вы видите это, вы, вероятно, смотрите на файл, созданный в мире DOS / Windows, где конец строки отмечен парой возврата каретки / перевода строки, тогда как в мире Unix конец строки отмечен одной новой строкой.

Как оно могло туда попасть?
Когда происходит изменение в формате файла.

Как мне от этого избавиться?
откройте ваш файл с

vim -b FILE_PATH

сохраните его следующей командой

:%s/^M//g

У вас есть опечатка в открывшемся фильре .
— Матеуш Пиотровски

4
Этот ответ ничего не добавляет к другим ответам. Первый абзац является почти дословной копией принятого ответа. Данный код ничего не сохранит , а только удалит все символы возврата каретки из всех строк. И я не уверен, как открытие файла в двоичном режиме поможет здесь.
— Дубу

2

В моем случае,

Ничто из вышеперечисленного не сработало, у меня был файл CSV, скопированный на компьютер Linux с моего Mac, и я использовал все вышеперечисленные команды, но ничего не помогло, кроме приведенного ниже

tr "\015" "\n" < inputfile > outputfile

У меня был файл, в котором символы ^ M были переключены между строк примерно так, как показано ниже

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,

0

Вы можете использовать Vim в режиме Ex:

ex -bsc '%s/\r//|x' file
  1. -b двоичный режим

  2. % выбрать все строки

  3. s замена

  4. \r возврат каретки

  5. x сохранить и закрыть


0

Добавьте следующую строку в ваш ~ / .vimrc

command! Tounix :call Preserve('1,$s/^M//')

Затем, когда у вас есть файл с окончанием строки Windows, выполните команду «: Tounix».


-1

В прошлом я видел, что даже файлы конфигурации не анализируются должным образом и жалуются на пробелы, но если вы vi и сделаете список установок, он не будет отображать пробелы, grep filename [[space]] покажет вам ^ M

вот когда dos2unix fileпомогает


Этот ответ ничего нового не принесет, действительно ли уже упоминается в двух ответах, гораздо более старых.
— Руи Ф. Рибейро
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.