Что такое `^ 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.